Node-Addon-Api Pass Array как аргумент функции
Я пытаюсь создать базовую надстройку нативного узла, где массив javascript передается от узла, а затем обрабатывается в C++. Проблема в том, что я не могу понять, как правильно передать массив. Я могу создать экземпляр массива без проблем, но назначив его с помощью info[0].as выдает ошибки.
Мой код с ++
#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++? Это вообще возможно?
0 ответов
Это работает для меня:
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();
}
Использование 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
,
Код ошибки здесь:
Array a = info[0].As<Array>;
который должен быть
Array a = info[0].As<Array>();
Я не смог найти решение для реального вопроса взаимодействия с объектом Javascript напрямую с помощью node-addon-api. Решением, которое я выбрал, является JSON.stringify любых массивов или объектов, а затем синтаксический анализ в C++ - это библиотека, которая называется fast json. Это единственный способ взаимодействия с объектами JavaScript, которые мне удалось найти.