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