{
"targets": [
{
"target_name": "loginfo",
"sources": [ "logparse.cc" ]
}
]
}
binding.gyp文件
target_name字段是最后产生的 build/Release/loginfo.node node动态库的名字
sources字段是源代码文件名
var addon = require('./build/Release/loginfo');
/* each page pagesize line */
console.log(addon.log_get_linenum("2015-12-01", "2015-12-05"));
console.log(addon.log_get_page("2015-12-01", "2015-12-05", "1"));
console.log(addon.log_set_pagesize("10"));
console.log(addon.log_get_page("2015-12-01", "2015-12-05", "29"));
test.js文件
require后面跟着的是binding.gyp文件target_name指定的node动态库名字
addon.log_get_linenum 就是调用c++的接口,这里有个映射关系
在logparse.cc里面 NODE_SET_METHOD(exports, "log_get_linenum", log_get_linenum);定义映射
js文件里的addon后面的函数对于第二个参数, 第三个参数为c++的函数
可以这样定义NODE_SET_METHOD(exports, "xxxxxxxx", log_get_linenum);
js这样调用 console.log(addon.xxxxxxxx("2015-12-01", "2015-12-05"));
#include <stdlib.h> /* atoi */
#include <iostream> /* cout */
#include <string> /* std::string */
#include <v8.h> /* v8::String etc. */
#include <node.h> /* NODE_MODULE etc. */
using namespace node;
using namespace v8;
using namespace std;
Handle<Value> log_get_linenum(const Arguments& args)
{
HandleScope scope;
v8::String::Utf8Value argv1(args[0]->ToString());
v8::String::Utf8Value argv2(args[0]->ToString());
std::string start(*argv1);
std::string end(*argv2);
/* return linenum */
int linenum = 123;
return scope.Close(v8::Number::New(linenum));
}
Handle<Value> log_set_pagesize(const Arguments& args)
{
HandleScope scope;
v8::String::Utf8Value argv1(args[0]->ToString());
std::string pagestr(*argv1);
int pagesize = atoi(pagestr.c_str());
/* set the pagesize */
cout << pagesize << endl;
return scope.Close(v8::Number::New(0));
}
Handle<Value> log_get_page(const Arguments& args)
{
HandleScope scope;
v8::String::Utf8Value argv1(args[0]->ToString());
v8::String::Utf8Value argv2(args[1]->ToString());
v8::String::Utf8Value argv3(args[2]->ToString());
std::string start(*argv1);
std::string end(*argv2);
std::string pageids(*argv3);
int pageid = atoi(pageids.c_str());
/*
* fetch the log page. and return it as json format
*/
cout << pageid << endl;
std::string jsonstr("{\"loginfo\": [{ \"logtime\":\"2015-12-24\", \"loglevel\":\"DEBUG\", \"logmsg\":\"hello\"},{...}...]}");
return scope.Close(v8::String::New(jsonstr.c_str()));
}
void init(Handle<Object> exports)
{
NODE_SET_METHOD(exports, "log_get_linenum", log_get_linenum);
NODE_SET_METHOD(exports, "log_set_pagesize", log_set_pagesize);
NODE_SET_METHOD(exports, "log_get_page", log_get_page);
}
NODE_MODULE(loginfo, init)
logparse.cc文件
依照node开发框架开发
NODE_MODULE(loginfo, init)
第一个参数为node动态库名字,也就是binding.gyp文件target_name指定的名字
第二个参数为初始化函数,初始化映射表
函数注意参数的转换
最后测试一下
bash# node-gyp configure build
bash# nodejs test.js
参数类型转换可以参考v8类,链接:http://izs.me/v8-docs/classv8_1_1Value.html