Node-Addon-Api передать массив как аргумент функции

Я пытаюсь создать базовый собственный надстройку узла, в котором массив 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++? Это вообще возможно?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
4 327
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Мне не удалось найти решение фактического вопроса о взаимодействии с объектом Javascript напрямую с помощью node-addon-api. Решение, которое я выбрал, - это JSON. Структурировать любые массивы или объекты, а затем проанализировать, а в С ++ - это библиотека под названием быстрый json. Это оказывается единственным способом взаимодействия с объектами javascript, которые мне удалось найти.

Это неправда. Кроме того, это резко замедляет код, потому что вам придется анализировать JSON в C++. В JavaScript это тоже не очень удобно.

Luke 18.02.2019 02:46

Я понимаю, что это было не идеальное решение, но это было лучшее, что я мог придумать в то время. С размером данных, с которыми я работал, это не было проблемой скорости. Также Rapid JSON - это очень быстрая библиотека C++ json.

Root0x 19.02.2019 23:29
Ответ принят как подходящий

Используйте 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>();

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