检查在C ++中创建的对象时出现节点错误

时间:2016-07-30 22:08:43

标签: c++ node.js node.js-addon

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

while($content = file_get_contents('https://www.example.com?id='.$i)) {
   if($i !== 10) {
      echo $i;
   }else{
      break;
   }
   $i++;
}

我正在调查一下,我发现我的命名属性(或拦截器)使这种情况发生。如果我将该组注释掉该属性的导出对象,该对象将在节点中显示我从C ++中公开的所有函数和变量。

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

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

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

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

我的问题是,是否可以修复“此问题”并避免在使用命名属性检查对象时抛出异常。

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

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

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();
}

如果它显示具有 > const f = require('bindings')('flac-bindings'); > f 功能的对象,请使用flac库的完整路径调用它,并显示错误。

0 个答案:

没有答案