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 ライブラリへのフル パスを指定して呼び出すと、エラーも表示されます。