Node.js аддон N-API - как зашифровать / проанализировать JSON?
Я пишу аддон для Node.js, использующий N-API (интерфейс C, не путать с оболочкой C++ node-addon-api вокруг N-API), который получает данные в формате JSON из внешнего источника и должен выполнить функцию обратного вызова JS в своей форме объекта. Тем не менее, я потерял способ проанализировать данные в формате JSON в надлежащий объект (т. Е. Полученный в результате JSON.parse) внутри аддона перед передачей его в обратный вызов JS и, похоже, передает его только в тексте форма.
Единственные примеры, которые я нашел до сих пор, которые делают это, включают непосредственное использование API C++ NAN и V8. Я что-то пропустил? Должен ли я сделать еще один вызов napi_call_function в JSON.parse, перехватить его возвращаемое значение и передать его дальше? (Если так, как я могу получить информацию обратного вызова 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);
// ...
0 ответов
Ниже приведен пример того, как вы можете преобразовывать и анализировать на конце C++, а не на конце Javascript. Napi позволяет вызывать функции javascript из кода C++. Ниже приведен пример того, как позвонить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