处理C ++节点中的JavaScript对象nan插件

时间:2018-05-12 17:33:39

标签: javascript c++ node.js v8 node-nan

我的代码是将JavaScript对象传递给用C ++实现的函数。 C ++代码需要验证每个属性的类型,并在缺少属性或类型错误时提供默认值。

以下代码似乎有效(仅显示整数情况),但我想知道是否有更简单的方法来处理这个问题。我绝不是这方面的专家,所以欢迎所有改进建议。

int get_integer(
    v8::Local<v8::Object> obj,
    v8::Local<v8::String> prop,
    int default_value = 0) {

    if (Nan::Has(obj, prop).FromMaybe(false)) {
        Nan::MaybeLocal<v8::Value> v = Nan::Get(obj, prop);
        if (!v.IsEmpty()) {
            v8::Local<v8::Value> val = v.ToLocalChecked();
            if (val->IsInt32() || val->IsNumber()) {
                return val->IntegerValue();
            }
        }
    }
    return default_value;
}

它的代码类似于以下代码:

v8::Local<v8::Object> obj = info[0]->ToObject();
v8::Local<v8::String> prop = Nan::New<v8::String>("prop").ToLocalChecked();
int x = get_integer(obj, prop);

1 个答案:

答案 0 :(得分:1)

如果您正在寻找的是简化,那么您应该查看NodeJ支持的名为N-API的新API。

代码变得更轻,因为您永远不必直接触摸任何v8对象。官方documentation主要用于C,但我建议您查看C ++包装。文档不完整,但由于您已经使用过NaN,因此它非常相似,您可以在C ++版本的“node-addon-api”文件夹下找到一些文章以及the examples

存在conversion tool以将基于NaN的代码转换为N-API代码,但由于您大量使用v8构造,我建议您仅使用API​​重做这些部分。