node.js调用C++开发的模块实例
如何用C++和node交互,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node。先回顾一下正统的用C++开发native模块的方法
#include<node.h> #include<v8.h> usingnamespacev8; //这里是hello函数的C++实现部分 Handle<Value>Method(constArguments&args){ HandleScopescope; returnscope.Close(String::New("world")); } //这里是模块的初始化函数,必须有 voidinit(Handle<Object>exports){ exports->Set(String::NewSymbol("hello"), FunctionTemplate::New(Method)->GetFunction()); } //这里定义本模块的名字和初始化函数 NODE_MODULE(hello,init)
这个模块用Node写的话,是这样的:
exports.hello=function(){ return'world'; }; 为了编译C++这个模块,还需要一个JSON格式的binding.gyp文件,来定义编译的细节。 { "targets":[ { "target_name":"hello", "sources":["hello.cpp"] } ] }
执行node-gypconfigurebuild 就直接编译了。
nodetest.js: varaddon=require('./build/Release/hello'); console.log(addon.hello());
就输出结果。
如此node就可以直接调用C++编写的程序。
对上面程序的解释:在hello.cc中,我们首先创建了一个函数Method,此函数返回一个"hello,world"的字符串,后面我们又创建了一个init的函数,作为一个初始化函数,我们去调用了一个函数
最后面,我们将这个模块绑定为:NODE_MODULE(hello,init)
在官网中指出,所有的node的插件必须输出一个初始化的函数,也就是说如下代码是在每个模块都必须有的,固定格式。
voidInitialize(Handle<Object>exports); NODE_MODULE(module_name,Initialize)
其中module_name必须对应上binding.gyp中的target_name就可以了。
经过了node-gypconfigurebuild编译以后会在当前文件下生成一个build的新的文件夹。我们通过在test.js中去引用这个build的结果,就可以调用C++的写的程序了。