我正在使用N-API(C 接口,不要与围绕 N-API 的node-addon-api C++ 包装器混淆)为 Node.js 编写一个插件,它从外部源接收 JSON 格式的数据,需要在其对象形式上执行一个 JS 回调函数。但是,在将 JSON 格式的数据传递给 JS 回调之前,我无法在插件中将其解析为适当的对象(即,由 JSON.parse 产生),并且似乎只能在其文本中传递它形式。
到目前为止,我发现的唯一示例涉及直接使用C++ NAN和 V8 API。我错过了什么吗?我是否应该对 JSON.parse 进行另一个 napi_call_function 调用,捕获其返回值,然后将其传递?(如果是这样,我如何从我的插件中获取 JSON.parse 回调信息?)是否有我没有找到的更简单的 API?
出于许多原因,我更愿意继续使用 C 而不是 C++,尽管我认为这是可以商量的。
foo.js
const myaddon = require('bindings')('myaddon');
const EventEmitter = require('events').EventEmitter;
const emitter = new EventEmitter();
emitter.on('eventReceived', (foo) => {
var obj = JSON.parse(foo); // *** this is what I'd like to avoid ***
console.log(obj.bar);
})
myaddon.RegisterForEvents(emitter.emit.bind(emitter));
myaddon.c
void AsyncComplete(napi_env env, napi_status status, void * data) {
// do some work to get the JSON text from the external source,
// setup argv with the necessary values:
// argv[0]: "eventReceived"
// argv[1]: JSON text -- would like to deserialize in addon, not in JS callback, so the JS callback receives a proper object
// Execute the JS function
napi_call_function(env, global /* from napi_get_global */, callback /* the emitter */, argc, argv, NULL);
// ...