引き続きv8.hを読みながらNodeモジュールを書く練習をする。
モジュールのメソッド定義ですが、名前の通りv8::Argumentsが引数の表現で、[]オペレータでアクセスするとv8::Value型のそれぞれの引数が得られる。型チェックはIsNumberやらIsStringといったメソッドはあっても、型を直接返してくれる物は無いのでやや面倒。
試しに、こんなモジュールを作ってみる。
呼び出し側のコード
実行結果
クラスメソッドしか持たないモジュールはこの書き方がわかれば作れそう。あと、コードを書く時はIDEの支援が欲しいので、Xcodeでソース開いてv8とnodeのコードをヘッダ検索パスに追加した状態で作業した方が楽できますね。

続きます
Node.jsのモジュールをC++で書く (ObjectとArrayを受け取るメソッド)
http://d.hatena.ne.jp/hagino_3000/20120320/1332228809
モジュールのメソッド定義ですが、名前の通りv8::Argumentsが引数の表現で、[]オペレータでアクセスするとv8::Value型のそれぞれの引数が得られる。型チェックはIsNumberやらIsStringといったメソッドはあっても、型を直接返してくれる物は無いのでやや面倒。
試しに、こんなモジュールを作ってみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <node.h> #include <v8.h> #include <iostream> using namespace v8; // 引数の数と、それぞれの型をチェックするメソッド Handle<Value> ArgumentTest( const Arguments& args) { HandleScope scope; for ( int i = 0; i < args.Length(); i++) { if (args[i]->IsString()) { std::cout << "String!!" << std::endl; } else if (args[i]->IsFunction()) { std::cout << "Function!!" << std::endl; } else if (args[i]->IsObject()) { std::cout << "Object!!" << std::endl; } else { // Number or Boolean or Date ... etc } } return scope.Close(v8::Number::New(args.Length())); } // 第一引数をそのままreturnするメソッド Handle<Value> ReturnTest( const Arguments& args) { HandleScope scope; return scope.Close(args[0]); } // メソッドのexport定義 void init(Handle<Object> target) { target->Set(String::NewSymbol( "argumentTest" ), FunctionTemplate::New(ArgumentTest)->GetFunction()); target->Set(String::NewSymbol( "returnTest" ), FunctionTemplate::New(ReturnTest)->GetFunction()); } NODE_MODULE(Test1, init) |
呼び出し側のコード
1 2 3 4 5 6 7 8 9 10 11 12 | var Test1 = require( './build/Release/Test1' ); console.log( "Check arguments..." ); var result = Test1.argumentTest( "str" , function (){}, {hoge:100}); console.log(result + ' arguments passed' ); console.log( "" ); console.log( "Check return value type" ); console.log( typeof (Test1.returnTest( "str" ))); console.log( typeof (Test1.returnTest(100))); console.log( typeof (Test1.returnTest( new Date()))); console.log( typeof (Test1.returnTest( function (){}))); |
実行結果
Check arguments... String!! Function!! Object!! 3 arguments passed Check return value type string number object function
クラスメソッドしか持たないモジュールはこの書き方がわかれば作れそう。あと、コードを書く時はIDEの支援が欲しいので、Xcodeでソース開いてv8とnodeのコードをヘッダ検索パスに追加した状態で作業した方が楽できますね。
続きます
Node.jsのモジュールをC++で書く (ObjectとArrayを受け取るメソッド)
http://d.hatena.ne.jp/hagino_3000/20120320/1332228809