Node.js插件编写-函数工厂与对象工厂的实现
Posted UsherYue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js插件编写-函数工厂与对象工厂的实现相关的知识,希望对你有一定的参考价值。
这篇文章我们通过通过nodejs插件完成 函数工厂和对象工厂的例子。
首先看下面这段node.js代码 ,我们引用的my_node_addon插件需要导出
createFunc函数 和 createObject函数, 并且 createObject函数返回的对象包含
add和addCallback 两个加法函数
var addon = require('bindings')('my_node_addon.node');
//函数工厂
var func=addon.createFunc()(1);
console.log('Create Function ret:' ,func);
//对象工厂
var obj = addon.createObject();
//调用对象方法
console.log(obj.add(3, 12))
//调用对象的额回调方法
obj.addCallback(1, 2, (ret) =>
console.log(ret);
);
插件源码main.cpp如下
#include <napi.h>
/**
* 加法
* @param info
* @return
*/
Napi::Value Add(const Napi::CallbackInfo &info)
//获取上下文环境
Napi::Env env = info.Env();
//如果参数少于2
if (info.Length() < 2)
//js中丢出类型异常
Napi::TypeError::New(env, "Wrong number of arguments")
.ThrowAsjavascriptException();
return env.Null();
//如果存在参数不是number类型
if (!info[0].IsNumber() || !info[1].IsNumber())
Napi::TypeError::New(env, "Wrong arguments").ThrowAsJavaScriptException();
return env.Null();
//转换成dobule 类型参数
double arg0 = info[0].As<Napi::Number>().DoubleValue();
double arg1 = info[1].As<Napi::Number>().DoubleValue();
//返回number类型
Napi::Number num = Napi::Number::New(env, arg0 + arg1);
return num;
/**
* 回调函数增加
* @param info
*/
void CallbackAdd(const Napi::CallbackInfo &info)
Napi::Env env = info.Env();
//如果参数少于2
if (info.Length() < 3)
//js中丢出类型异常
Napi::TypeError::New(env, "Wrong number of arguments")
.ThrowAsJavaScriptException();
return;
//如果存在参数不是number类型
if (!info[0].IsNumber() || !info[1].IsNumber())
Napi::TypeError::New(env, "Wrong arguments").ThrowAsJavaScriptException();
return;
//第三个参数不是函数
if (!info[2].IsFunction())
Napi::TypeError::New(env, "Wrong callback").ThrowAsJavaScriptException();
return;
auto v1 = info[0].As<Napi::Number>().DoubleValue();
auto v2 = info[1].As<Napi::Number>().DoubleValue();
Napi::Function cb = info[2].As<Napi::Function>();
cb.Call(env.Global(), Napi::Number::New(env, v1 + v2));
//创建函数
//Napi::Value func(const Napi::CallbackInfo &info)
// Napi::Env &&env=info.Env();
// auto v1=info[0].As<Napi::String>();
// return v1;
//
Napi::Function CreateFunction(const Napi::CallbackInfo& info)
Napi::Env env = info.Env();
//lambda 函数 创建一个匿名函数
auto funcTmp=[](const Napi::CallbackInfo &info)->Napi::Value
Napi::Env &&env=info.Env();
auto v1=info[0].ToString();
return v1;
;
//直接返回匿名函数
Napi::Function fn = Napi::Function::New(env, funcTmp);
return fn;
Napi::Object CreateObject(const Napi::CallbackInfo &info)
Napi::Env env = info.Env();
Napi::Object obj = Napi::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));
return obj;
//模块注册函数,用于每个自定义模块注册
Napi::Object Init(Napi::Env env, Napi::Object exports)
//暴露方法
exports.Set(Napi::String::New(env, "createObject"), Napi::Function::New(env, CreateObject));
exports.Set(Napi::String::New(env,"createFunc"),Napi::Function::New(env,CreateFunction));
return exports;
NODE_API_MODULE(addon, Init)
如何编译插件不在啰嗦,请看前几篇文章,至此我们已经成功通过C++ 为nodejs 插件增加了 函数工厂 和对象工厂。
以上是关于Node.js插件编写-函数工厂与对象工厂的实现的主要内容,如果未能解决你的问题,请参考以下文章