0

nodejs のアドオンとして C++ の (大きな) コードがあります。コードの一部により、モジュールをエクスポートするオブジェクトを検査しようとすると、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());

ゲッター関数は、特定の入力に対して数値を返します。それ以外の場合は未定義を返します。その例:

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