0

我有一段(大)代码在 C++ 中作为 nodejs 的附加组件。当我尝试检查导出模块的对象时,部分代码使 nodejs 在内部引发异常。

TypeError: Cannot convert a Symbol value to a string
    at Object.objectToString (internal/util.js:84:36)
    at isError (internal/util.js:80:18)
    at formatValue (util.js:408:9)
    at formatProperty (util.js:781:15)
    at util.js:641:12
    at Array.map (native)
    at formatObject (util.js:640:15)
    at formatValue (util.js:579:16)
    at formatProperty (util.js:781:15)
    at util.js:641:12

我进行了一些调查,发现我拥有的命名属性(或拦截器)使这种情况发生。如果我将此属性的导出对象的集合注释掉,则该对象会显示在节点中,其中包含我从 C++ 公开的所有函数和变量。

要创建和设置命名属性,我使用为它创建的宏,但基本上是这样做的:

Local<ObjectTemplate> someFuncVar = Nan::New<ObjectTemplate>();
Nan::SetNamedPropertyHandler(someFuncVar, someFunc);
Nan::Set(target, Nan::New("someFunc").ToLocalChecked(), Nan::NewInstance(someFuncVar).ToLocalChecked());

getter 函数返回某些特定输入的数字,否则返回未定义的。一个例子:

NAN_PROPERTY_GETTER(DecWriteStatus) {
    Nan::Utf8String propertyName(property);
    std::string PropertyName(*propertyName);

    if(PropertyName == "CONTINUE") info.GetReturnValue().Set(0);
    else if(PropertyName == "ABORT") info.GetReturnValue().Set(1);
    else info.GetReturnValue().SetUndefined();
}

我的问题是是否有可能解决“这个问题”并避免在使用命名属性检查对象时引发异常。

我使用节点 6.3.1 和 Nan 2.4.0。似乎Linux上的问题,一切都一样,有效。也许这只发生在 OS X 上。

要测试这种奇怪的行为,您可以下载我的项目,构建它(您需要在某处安装 libFLAC)并尝试在节点中执行以下行:

 > const f = require('bindings')('flac-bindings');
 > f

如果它显示带有f.load()函数的对象,请使用 flac 库的完整路径调用它,并且也会显示错误。

4

0 回答 0