我正在使用N-API(C接口,不要与node-addon-api C++围绕N-API的包装器混淆(为Node.js编写一个插件,该插件从外部源接收JSON格式的数据,并需要在其对象形式上执行JS回调函数。但是,在将 JSON 格式的数据传递到 JS 回调之前,我迷失了将 JSON 格式的数据解析为插件中的适当对象(即由 JSON.parse 生成的数据(的方法,并且似乎只能以文本形式传递它。
到目前为止,我发现的唯一这样做的例子涉及直接使用 C++ NAN 和 V8 API。我错过了什么吗?我是否应该对 JSON.parse 进行另一次napi_call_function调用,捕获其返回值,然后将其传递?(如果是这样,我如何从我的插件中获取 JSON.parse 回调信息?有没有我找不到的更简单的 API?
出于很多原因,我宁愿留在C,而不是C++,尽管我认为这是可以协商的。
傅.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);
// ...
下面是一个如何在C++端而不是Javascript端进行字符串化和解析的示例。Napi 允许您从C++代码调用 javascript 函数。下面是如何调用JSON.stringify()
和JSON.parse()
的示例
Napi::String JSONStringify(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
Napi::Object json_object = info[0].As<Napi::Object>();
Napi::Object json = env.Global().Get("JSON").As<Napi::Object>();
Napi::Function stringify = json.Get("stringify").As<Napi::Function>();
return stringify.Call(json, { json_object }).As<Napi::String>();
}
Napi::Object JSONParse(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
Napi::String json_string = info[0].As<Napi::String>();
Napi::Object json = env.Global().Get("JSON").As<Napi::Object>();
Napi::Function parse = json.Get("parse").As<Napi::Function>();
return parse.Call(json, { json_string }).As<Napi::Object>();
}
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports["jsonStringify"] = Napi::Function::New(env, JSONStringify);
exports["jsonParse"] = Napi::Function::New(env, JSONParse);
return exports;
}
NODE_API_MODULE(json, Init)
来源: https://github.com/nodejs/node-addon-api/issues/410#issuecomment-574876170