Я пытаюсь создать базовый собственный надстройку узла, в котором массив javascript передается из узла, а затем обрабатывается на С ++. Проблема в том, что я не могу понять, как правильно передать массив. Я могу создать экземпляр массива без проблем, но присвоение его с помощью info [0] .as вызывает ошибки.
Мой код на C++
#include <napi.h>
using namespace Napi;
using namespace std;
Value Add(const CallbackInfo& info)
{
Env env = info.Env();
Array result = Napi::Array::New(env);
Array a = info[0].As<Array>;
double arg1 = info[1].As<Number>().DoubleValue();
Number num = Napi::Number::New(env, 2 + arg1);
return num;
}
Я получаю ошибку
../cppsrc/main.cpp: In function ‘Napi::Value Add(const Napi::CallbackInfo&)’:
../cppsrc/main.cpp:12:21: error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type ‘Napi::Array’ requested
Array a = info[0].As<Array>;
~~~~~~~~^~~~~~~~~
Как правильно передать массив в C++? Это вообще возможно?





Мне не удалось найти решение фактического вопроса о взаимодействии с объектом Javascript напрямую с помощью node-addon-api. Решение, которое я выбрал, - это JSON. Структурировать любые массивы или объекты, а затем проанализировать, а в С ++ - это библиотека под названием быстрый json. Это оказывается единственным способом взаимодействия с объектами javascript, которые мне удалось найти.
Я понимаю, что это было не идеальное решение, но это было лучшее, что я мог придумать в то время. С размером данных, с которыми я работал, это не было проблемой скорости. Также Rapid JSON - это очень быстрая библиотека C++ json.
Используйте Napi::Object. Napi::Array фактически унаследован от Napi::Object.
Вы можете заменить код Array a = info[0].As<Array>; на Array a = info[0].ToObject();.
Затем вы можете получить доступ к элементам данных через значение
operator[] (uint32_t index) const
Источник: https://nodejs.github.io/node-addon-api/class_napi_1_1_object.html
Редактировать: бонусная функция, если передан аргумент, не являющийся объектом, это автоматически вызовет Error: Object Expected.
Это работает для меня:
void runSetPropertyAsyncWorker(const CallbackInfo& info)
{
std::string path = info[0].As<Napi::String>();
int property = info[1].As<Number>();
int dataSize = info[2].As<Number>();
Array b = info[3].As<Array>();
for(int i = 0; i<b.Length(); i++)
{
Napi::Value v = b[i];
if (v.IsNumber())
{
int value = (int)v.As<Napi::Number>();
...
...
}
}
...
...
Function callback = info[4].As<Function>();
AsyncWorker* asyncWorker = new SetPropertyAsyncWorker(callback, ...);
asyncWorker->Queue();
}
код ошибки здесь:
Array a = info[0].As<Array>;
который должен быть
Array a = info[0].As<Array>();
Это неправда. Кроме того, это резко замедляет код, потому что вам придется анализировать JSON в C++. В JavaScript это тоже не очень удобно.