Чтение объекта N-API в примитив C

#javascript #c #casting #node-addon-api

#javascript #c #Кастинг #узел-аддон-api

Вопрос:

Я создал простой модуль N-API, начиная с шаблона ObjectWrap для generator-napi-module, и успешно передал данные (массив, содержащий объекты со строковыми, числовыми и логическими свойствами) в JS. Однако я не могу проанализировать свойства одного из тех же объектов, переданных обратно в машинный код; в частности, создание uint32_t значения из свойства (числа) переданного объекта.

Предположим, что массив объектов создан и передан в JS:

 Napi::Value ObjectWrapAddon::GetSomeList(const Napi::CallbackInfoamp; info){
  Napi::Env env = info.Env();
  native_struct_one *data = NULL;
  native_struct_two opts = { TRUE,FALSE,FALSE };
  int retVal = native_lib_method(amp;data, amp;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::CallbackInfoamp; 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() выдает A number was expected ошибку uint32_t temp = obj.Get('someProp').As<Napi::Number>() .

Как мне создать собственное (C ) значение из значения свойства объекта JS?

Ответ №1:

Я пропустил две вещи, которые позволяют этому работать:

  1. Я был несовместим со строками при использовании Get / Set. Если Napi::Object::Set используется с одинарными кавычками, одинарные кавычки должны использоваться с Napi::Object::Get; аналогично для двойных кавычек.
  2. В документах необходимо использовать метод Uint32Value() (я, должно быть, удалил это в своей работе), предоставляя: uint32_t temp = obj.Get("someProp").As<Napi::Number>().Uint32Value();

Устранение этих проблем обеспечивает ожидаемое поведение и результат.