-->

Node.js

と、いってもここにあるHello Worldを試すだけだが。

リンク先に書いてあるように、hello.ccとbinding.gypをコピペして作る。そして、node-gyp configureを実行するんだが、node-gypがないって言われる。(^^;)
node-gypは、npmを使ってインストールできる。こんな感じ。(OS Xの場合)

$ sudo npm install node-gyp -g

node-gyp configureを実行すると、node-v0.12.6.tar.gzを取りにいってる。たしか、Addonで使うC言語のヘッダーファイルとかがなかったと思うんで、それを取得するためと思われる。

そして、node-gyp buildを実行すると、build/Release/addon.nodeができる。
試すためにhello.jsをコピペして作って、node hello.jsで実行する。


このエントリーをはてなブックマークに追加

フォームで入力された値を取得してみる。
www/index.htmlにログイン入力フォームを用意する。こんなやつ。

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta charset="utf-8">
	<title>ログイン</title>
</head>
<body>
	<form method="post" action="/post">
	    <p>ユーザID:<input type="text" name="userid"></p>
	    <p>パスワード:<input type="password" name="password"></p>
	    <p><input type="submit"></p>
	</form>
</body>
</html>

userid、passwordをpostメソッドっで/postに送信するようになっている。

次にソース。

/// <reference path="./typings/node/node-0.11.d.ts" />

import http = require('http');
import fs = require('fs');
import url = require('url');
import querystring = require('querystring');

var server = http.createServer(requestServer);
server.listen(9999);

function requestServer(req:http.ServerRequest, res:http.ServerResponse):void {
	var uri = url.parse(req.url, true);		// 第2引数trueでqueryストリングを解析する(getの時使う)
	
	if(uri.pathname == "/post") {
		if(req.method.toLowerCase() === "post") {	// postメソッドなら
			console.log("post");
			var postString = "";
			// 非同期でデータを読み込むようにする。
			req.on("data", data => {
				postString += data;
			});
			// 読み込み終わった場合の処理をする。
			req.on("end", ()=> {
				var postData = querystring.parse(postString);
				res.writeHead(200, { "Content-Type": "text/plain" });
				res.write("userid:" + postData["userid"] + "\n");
				res.write("password:" + postData["password"]);
				res.end();
			});
		} if(req.method.toLowerCase() === "get") {	// getメソッドなら
			// url.parseの第2引数でqueryストリングを解析しているので
			// uri.queryでフォーム入力した値を取得できる。
			console.log("get");
			res.writeHead(200, { "Content-Type":"text/plain"});
			res.write("userid:" + uri.query["userid"] + "\n");
			res.write("password:" + uri.query["password"]);
			res.end();
		} else {
			res.writeHead(404, { "Content-Type": "text/plain" });
			res.write("404 Not Found.");
			res.end();
		}
	} else {
		// ログインフォームのHTMLを返す。
		console.log("etc");
		res.writeHead(200, { "Content-Type": "text/html" });
		fs.createReadStream("www/index.html")
			.pipe(res);
	}
}

ソースのコメントの通りなんで、説明は省く。
いや、ちょっと書いとくか。
req.onで"data"でデータを受信するように設定して、"end"で受信終了時の処理を書く。ここでは、"end"でuseridとpasswordを表示するようにしている。
getメソッドで渡す場合は、queryストリングで渡されるので、url.parseでurlを解析すればいい。



このエントリーをはてなブックマークに追加

[Node.js] XMLファイルの読み込みで書いたようにxml2jsのモジュールと型定義ファイルをインストールしておく。

JavaScriptのオブジェクトを作って、それをファイルに書き込むサンプルは次のようになる。

/// <reference path="./typings/node/node-0.11.d.ts" />
/// <reference path="./typings/xml2js/xml2js.d.ts" />

import fs = require("fs");
import xml2js = require("xml2js");

class test {
	public hoge3:string;
	public hoge4:string;
	
	public constructor(hoge3:string, hoge4:string) {
		this.hoge3 = hoge3;
		this.hoge4 = hoge4;
	}
}

var obj = new test("あいうえお", "かきくけこ");
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
fs.writeFile("./test2.xml", xml, err => {
	if(err) {
		console.log(err);
	}
});

実行すると、test2.xmlに保存される。test2.xmlは次のようになる。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
  <hoge3>あいうえお</hoge3>
  <hoge4>かきくけこ</hoge4>
</root>


このエントリーをはてなブックマークに追加

xml2jsというモジュールを使うとXMLからJavaScriptのオブジェクトができる。

xml2jsのインストール

$ npm install xml2js

でインストールする。TypeScriptの型定義ファイルもあるのでインストールする。

$ tsd install xml2js -ors

test.xmlというXMLファイルを用意する。

<?xml version="1.0" encoding='UTF-8'?>
<root>
	<hoge1>あいうえお</hoge1>
	<hoge2>123</hoge2>
</root>

読み込むサンプルは次のようになる。

/// <reference path="./typings/node/node-0.11.d.ts" />
/// <reference path="./typings/xml2js/xml2js.d.ts" />

import fs = require("fs");
import xml2js = require("xml2js");

fs.readFile("./test.xml", (err, data)=> {
	xml2js.parseString(data.toString(), (err, result)=> {
		if(err) {
			console.log(err);
		} else {
			console.dir(result);
			console.log(result.root.hoge1[0]);		// 配列になってる
			console.log(result.root.hoge2[0]);		// 配列になってる
		}
	});
});

これを実行した結果は次のようになる。

{ root: { hoge1: [ 'あいうえお' ], hoge2: [ '123' ] } }
あいうえお
123


このエントリーをはてなブックマークに追加

Cookieのやりとりだ。

/// <reference path="./typings/node/node-0.11.d.ts" />

import http = require('http');
import url = require('url');
import path = require('path');
import querystring = require('querystring');

var port = 9999;				// 待ち受けポート番号

// サーバー起動
var server = http.createServer(requestServer)
	.listen(port);

// 接続されたときに呼ばれる関数
function requestServer(req:http.ServerRequest, res:http.ServerResponse):void {
	var uri = url.parse(req.url, true);

	console.log(uri.pathname);
	
	switch(uri.pathname) {
		case "/set":
			res.setHeader("Content-Type", "text/plain");
			// Cookieに"hoge1=111"と"hoge2=あいうえお"を設定する。
			res.setHeader("Set-Cookie", <any>[ "hoge1=111", "hoge2=" + 
				querystring.escape("あいうえお") ]);
			res.writeHead(200);
			res.write("test");
			res.end();
			break;
		case "/get":
			res.writeHead(200, { "Content-Type" : "text/plain" });
			if(req.headers.cookie !== undefined) {
				// 設定されているCookieをブラウザに表示する
				res.write(req.headers.cookie);
			} else {
				res.write("Unset Cookie");
			}
			res.end();
			break;
		default:
			res.writeHead(404, {"Content-Type" : "text/plain"});
			res.write("404 Not found.");
			res.end();
	}
}

http://localhost:9999/set にブラウザでアクセスするとクッキーがセットされ、
http://localhost:9999/get にアクセするとセットされているクッキーが表示される。
"hoge1=111; hoge2=%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A"と表示されるのでわかるように、;で分割してデコードしたりしないといけない。
が、node-cookieというモジュールがあるのでそれを使うとその辺のことをやってくれる。

$ npm install cookie

でインストールする。

TypeScriptの型定義ファイルもあるので

$ tsd install cookie -ors

でインストールする。

先頭の方で

/// <reference path="./typings/cookie/cookie.d.ts" />

import cookie = require('cookie');

を追加する。

クッキーの設定は、次のようになる。

res.setHeader("Set-Cookie", <any>[
	cookie.serialize("hoge1", "111"),
	cookie.serialize("hoge2", "あいうえお"),
	cookie.serialize("hoge3", "かきくけこ", { maxAge:60 })	// 有効期限を60秒に
]);

日本語のエンコードもやってくれる。有効期限なんかも設定できる。
取得するところは、次のようになる。

var cookies = cookie.parse(req.headers.cookie);
for(var key in cookies) {
	res.write(key + "=" + cookies[key] + "\n");
}

元のソースのそれぞれの場所を上のように変えてブラウザでアクセスすると

hoge1=111
hoge2=あいうえお
hoge3=かきくけこ

のように表示される。
日本語のデコードもやってくれる。hoge3は、60秒後にはなくなる。



このエントリーをはてなブックマークに追加

↑このページのトップヘ