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

Другие вопросы по тегам