【问题标题】:Reading N-API object into C++ primitive将 N-API 对象读入 C++ 原语
【发布时间】:2020-12-30 20:03:35
【问题描述】:

我从 generator-napi-module 的 ObjectWrap 样板开始创建了一个简单的 N-API 模块,并成功地将数据(包含具有字符串、数字和布尔属性的对象的数组)传递给 JS。但是,我无法解析传递回本机代码的相同对象之一的属性;具体来说,从传递的对象的属性(数字)创建uint32_t 值。

假设创建了一个对象数组并传递给 JS:

Napi::Value ObjectWrapAddon::GetSomeList(const Napi::CallbackInfo& info){
  Napi::Env env = info.Env();
  native_struct_one *data = NULL;
  native_struct_two opts = { TRUE,FALSE,FALSE };
  int retVal = native_lib_method(&data, &opts);
  if(retVal!=OK) {
    return Napi::Array::New(env); // return empty array
  }
  Napi::Array arr = Napi::Array::New(env);
  uint32_t i = 0;
  do {
    Napi::Object tempObj = Napi::Object::New(env);
    tempObj.Set("someProp", data->someVal);
    arr[i] = tempObj;
    i++;
    data = data->next;
  } while(data);
  return arr;
}

然后将这些对象之一传递给本机函数调用:

Napi::Value ObjectWrapAddon::OtherMethod(const Napi::CallbackInfo& info){
  Napi::Env env = info.Env();
  Napi::Object obj = info[0].As<Napi::Object>();
  uint32_t temp = obj.Get("someProp").As<Napi::Number>();
  return Napi::Number::New(env, temp);
}

这构建得很好,但是上面的 OtherMethod() 在uint32_t temp = obj.Get('someProp').As&lt;Napi::Number&gt;() 处给出了一个A number was expected 错误。

如何从 JS 对象属性值创建本机 (C++) 值?

【问题讨论】:

    标签: javascript c++ casting node-addon-api


    【解决方案1】:

    我错过了两件事,这使得它可以工作:

    1. 我在使用 Get/Set 时与字符串不一致。如果 Napi::Object::Set 与单引号一起使用,则单引号必须与 Napi::Object::Get 一起使用;双引号也是如此。
    2. Uint32Value() 方法需要根据the docs 使用(我必须在我的修补中删除它),给出:uint32_t temp = obj.Get("someProp").As&lt;Napi::Number&gt;().Uint32Value();

    解决这些问题可提供预期的行为和输出。

    【讨论】:

      猜你喜欢
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多