我有一段(大)代码在 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 库的完整路径调用它,并且也会显示错误。