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插件编写-函数工厂与对象工厂的实现的主要内容,如果未能解决你的问题,请参考以下文章

Node.js插件编写-函数工厂与对象工厂的实现

Node.js插件编写-函数工厂与对象工厂的实现

Node.js插件编写-创建类原型以及类工厂

Node.js插件编写-创建类原型以及类工厂

Node.js插件编写-创建类原型以及类工厂

Node.js插件编写-创建类原型以及类工厂