关于C#:Node-Addon-Api传递数组作为函数参数

Node-Addon-Api Pass Array As Function Argument

我正在尝试创建一个基本的本机节点插件,其中从节点传递了javascript数组,然后在c中对其进行了处理。问题是我不知道如何正确传递数组。我可以实例化该数组,而不会出现问题,但是可以使用info [0]进行分配。抛出错误。

我的c代码是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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;
}

我得到的错误是

1
2
3
4
../cppsrc/main.cpp: In function a€?Napi::Value Add(const Napi::CallbackInfo&)a€?:
../cppsrc/main.cpp:12:21: error: conversion from a€?<unresolved overloaded function type>a€? to non-scalar type a€?Napi::Arraya? requested
   Array a = info[0].As<Array>;
             ~~~~~~~~^~~~~~~~~

将数组传递给c的正确方法是什么?可能吗?


这对我有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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::ObjectNapi::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


错误代码在这里:

1
Array a = info[0].As<Array>;

应为

1
Array a = info[0].As<Array>();

我无法找到直接通过node-addon-api与Javascript对象进行交互的实际问题的解决方案。我选择使用的解决方案是JSON.stringify任何数组或对象,然后解析,然后在c中创建一个名为Rapid json的库。事实证明,这是与我能够找到

的javascript对象进行交互的唯一方法