Node-Addon-Api Pass Array в качестве аргумента функции - PullRequest
0 голосов
/ 28 сентября 2018

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

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Используйте Napi::Object.Napi::Array фактически унаследовано от Napi::Object.

. Вы можете заменить код Array a = info[0].As<Array>; на Array a = info[0].ToObject();.

. Затем вы можете получить доступ к элементам данных через значение operator[] (uint32_t index) const* 1011.*

Источник : https://nodejs.github.io/node-addon-api/class_napi_1_1_object.html

Редактировать : Бонусная функция: если передан аргумент, который не является объектом, он автоматически вызовет Error: Object Expected.

0 голосов
/ 20 марта 2019

Это работает для меня:

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();
}
0 голосов
/ 08 декабря 2018

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

...