将 N-API 对象读入 C++ 原语
Reading N-API object into C++ primitive
我创建了一个简单的 N-API 模块,从 generator-napi-module 的 ObjectWrap 样板开始,并成功地将数据(包含具有字符串、数字和布尔属性的对象的数组)传递给 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<Napi::Number>()
处给出了 A number was expected
错误。
如何从 JS 对象 属性 值创建本机 (C++) 值?
我错过了两件事,这让这行得通:
- 我在使用Get/Set时与字符串不一致。如果 Napi::Object::Set 与单引号一起使用,则单引号必须与 Napi::Object::Get 一起使用;双引号也是如此。
- Uint32Value() 方法需要根据 the docs 使用(我必须在我的修补中删除它),给出:
uint32_t temp = obj.Get("someProp").As<Napi::Number>().Uint32Value();
解决这些问题可提供预期的行为和输出。
我创建了一个简单的 N-API 模块,从 generator-napi-module 的 ObjectWrap 样板开始,并成功地将数据(包含具有字符串、数字和布尔属性的对象的数组)传递给 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<Napi::Number>()
处给出了 A number was expected
错误。
如何从 JS 对象 属性 值创建本机 (C++) 值?
我错过了两件事,这让这行得通:
- 我在使用Get/Set时与字符串不一致。如果 Napi::Object::Set 与单引号一起使用,则单引号必须与 Napi::Object::Get 一起使用;双引号也是如此。
- Uint32Value() 方法需要根据 the docs 使用(我必须在我的修补中删除它),给出:
uint32_t temp = obj.Get("someProp").As<Napi::Number>().Uint32Value();
解决这些问题可提供预期的行为和输出。