这篇文章我们通过通过nodejs插件完成函数工厂和对象工厂的例子。 首先看下面这段node。js代码,我们引用的mynodeaddon插件需要导出 createFunc函数和createObject函数,并且createObject函数返回的对象包含 add和addCallback两个加法函数varaddonrequire(bindings)(mynodeaddon。node);函数工厂varfuncaddon。createFunc()(1);console。log(CreateFunctionret:,func);对象工厂varobjaddon。createObject();调用对象方法console。log(obj。add(3,12))调用对象的额回调方法obj。addCallback(1,2,(ret){console。log(ret);}); 插件源码main。cpp如下includenapi。h加法paraminforeturnNapi::ValueAdd(constNapi::CallbackInfoinfo){获取上下文环境Napi::Envenvinfo。Env();如果参数少于2if(info。Length()2){js中丢出类型异常Napi::TypeError::New(env,Wrongnumberofarguments)。ThrowAsJavaScriptException();returnenv。Null();}如果存在参数不是number类型if(!info〔0〕。IsNumber()!info〔1〕。IsNumber()){Napi::TypeError::New(env,Wrongarguments)。ThrowAsJavaScriptException();returnenv。Null();}转换成dobule类型参数doublearg0info〔0〕。AsNapi::Number()。DoubleValue();doublearg1info〔1〕。AsNapi::Number()。DoubleValue();返回number类型Napi::NumbernumNapi::Number::New(env,arg0arg1);returnnum;}回调函数增加paraminfovoidCallbackAdd(constNapi::CallbackInfoinfo){Napi::Envenvinfo。Env();如果参数少于2if(info。Length()3){js中丢出类型异常Napi::TypeError::New(env,Wrongnumberofarguments)。ThrowAsJavaScriptException();return;}如果存在参数不是number类型if(!info〔0〕。IsNumber()!info〔1〕。IsNumber()){Napi::TypeError::New(env,Wrongarguments)。ThrowAsJavaScriptException();return;}第三个参数不是函数if(!info〔2〕。IsFunction()){Napi::TypeError::New(env,Wrongcallback)。ThrowAsJavaScriptException();return;}autov1info〔0〕。AsNapi::Number()。DoubleValue();autov2info〔1〕。AsNapi::Number()。DoubleValue();Napi::Functioncbinfo〔2〕。AsNapi::Function();cb。Call(env。Global(),{Napi::Number::New(env,v1v2)});}创建函数Napi::Valuefunc(constNapi::CallbackInfoinfo){Napi::Envenvinfo。Env();autov1info〔0〕。AsNapi::String();returnv1;}Napi::FunctionCreateFunction(constNapi::CallbackInfoinfo){Napi::Envenvinfo。Env();lambda函数创建一个匿名函数autofuncTmp〔〕(constNapi::CallbackInfoinfo)Napi::Value{Napi::Envenvinfo。Env();autov1info〔0〕。ToString();returnv1;};直接返回匿名函数Napi::FunctionfnNapi::Function::New(env,funcTmp);returnfn;}Napi::ObjectCreateObject(constNapi::CallbackInfoinfo){Napi::Envenvinfo。Env();Napi::ObjectobjNapi::Object::New(env);obj。Set(Napi::String::New(env,add),Napi::Function::New(env,Add));obj。Set(Napi::String::New(env,addCallback),Napi::Function::New(env,CallbackAdd));returnobj;}模块注册函数,用于每个自定义模块注册Napi::ObjectInit(Napi::Envenv,Napi::Objectexports){暴露方法exports。Set(Napi::String::New(env,createObject),Napi::Function::New(env,CreateObject));exports。Set(Napi::String::New(env,createFunc),Napi::Function::New(env,CreateFunction));returnexports;}NODEAPIMODULE(addon,Init) 如何编译插件不在啰嗦,请看前几篇文章,至此我们已经成功通过C为nodejs插件增加了函数工厂和对象工厂。