如何使用 Node-API 获取字符串形式的 JavaScript 数字
How to get a JavaScript number as a string using Node-API
我正在使用 Node-API.
构建一个 Node.js 插件
逻辑已简化如下,
使用将 js 数组传递到插件中并获取一些过滤后的数组作为输出。
在插件内部,算法将跳过任何空字符串和错误值。
下面是使用代码片段。整个插件在这里可用:https://replit.com/@dinindu/node-api-addon-compact#addon.c
const addon = require("bindings")("addon.node");
const array = ['0', false, '', {a:'1'}, '2', "str"];
console.log(addon.compact(array)); // expected output: ['0', {a:'1'}, '2', "str"]
// addon.c
#include <assert.h>
#include <node_api.h>
#include <stdlib.h>
#define DECLARE_NAPI_METHOD(name, func) \
{ name, 0, func, 0, 0, 0, napi_default, 0 }
#define DECLARE_WITH_STATUS_CHECK(size, name, func) \
napi_property_descriptor func##_desc = DECLARE_NAPI_METHOD(name, func); \
status = napi_define_properties(env, exports, size, &func##_desc); \
assert(status == napi_ok);
static napi_value compact(napi_env env, napi_callback_info info) {
size_t argc = 1;
napi_value args[1];
napi_get_cb_info(env, info, &argc, args, NULL, NULL);
uint32_t length;
napi_get_array_length(env, args[0], &length);
napi_value output_array;
napi_create_array_with_length(env, NAPI_AUTO_LENGTH, &output_array);
uint32_t result_index = 0;
for (size_t i = 0; i < length; i++) {
napi_value value;
napi_get_element(env, args[0], i, &value);
napi_valuetype type;
napi_typeof(env, value, &type);
if (type == napi_boolean) {
bool result;
napi_get_value_bool(env, value, &result);
if (result == false) continue;
}
char* str_buffer;
bool str_found = false;
if (type == napi_string) {
size_t str_buffer_size;
napi_get_value_string_utf8(env, value, NULL, 0, &str_buffer_size);
str_buffer = (char*)calloc(str_buffer_size + 1, sizeof(char));
size_t str_result;
napi_get_value_string_utf8(env, value, str_buffer, str_buffer_size, &str_result);
str_found = true;
if (*str_buffer == '[=13=]') {
free(str_buffer);
str_found = false;
continue;
}
}
napi_set_element(env, output_array, result_index, value);
result_index++;
if (str_found) free(str_buffer);
}
return output_array;
}
static napi_value Init(napi_env env, napi_value exports) {
napi_status status;
DECLARE_WITH_STATUS_CHECK(1, "compact", compact)
return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
我不明白的是,预期的输出应该包含除 false
和 ''
之外的所有值。但它似乎也跳过 '0'
和 '2'
,这意味着数字字符。我通过在它后面添加另一个数字 ('01'
) 来测试它,然后它就可以工作了。
为什么会这样?为什么 C
会跳过单个字符数字?我怎样才能得到我的预期输出?
提前致谢。
我在深入研究 Node.js 源代码并进行此更改后解决了这个问题,
我换了,
napi_get_value_string_utf8(env, value, str_buffer, str_buffer_size, &str_result);
和
napi_get_value_string_utf8(env, value, str_buffer, str_buffer_size + 1, &str_result);
将1
添加到str_buffer_size
简单地解决了问题。但我不明白为什么,但它还是解决了我的问题。
我正在使用 Node-API.
构建一个 Node.js 插件逻辑已简化如下,
使用将 js 数组传递到插件中并获取一些过滤后的数组作为输出。
在插件内部,算法将跳过任何空字符串和错误值。
下面是使用代码片段。整个插件在这里可用:https://replit.com/@dinindu/node-api-addon-compact#addon.c
const addon = require("bindings")("addon.node");
const array = ['0', false, '', {a:'1'}, '2', "str"];
console.log(addon.compact(array)); // expected output: ['0', {a:'1'}, '2', "str"]
// addon.c
#include <assert.h>
#include <node_api.h>
#include <stdlib.h>
#define DECLARE_NAPI_METHOD(name, func) \
{ name, 0, func, 0, 0, 0, napi_default, 0 }
#define DECLARE_WITH_STATUS_CHECK(size, name, func) \
napi_property_descriptor func##_desc = DECLARE_NAPI_METHOD(name, func); \
status = napi_define_properties(env, exports, size, &func##_desc); \
assert(status == napi_ok);
static napi_value compact(napi_env env, napi_callback_info info) {
size_t argc = 1;
napi_value args[1];
napi_get_cb_info(env, info, &argc, args, NULL, NULL);
uint32_t length;
napi_get_array_length(env, args[0], &length);
napi_value output_array;
napi_create_array_with_length(env, NAPI_AUTO_LENGTH, &output_array);
uint32_t result_index = 0;
for (size_t i = 0; i < length; i++) {
napi_value value;
napi_get_element(env, args[0], i, &value);
napi_valuetype type;
napi_typeof(env, value, &type);
if (type == napi_boolean) {
bool result;
napi_get_value_bool(env, value, &result);
if (result == false) continue;
}
char* str_buffer;
bool str_found = false;
if (type == napi_string) {
size_t str_buffer_size;
napi_get_value_string_utf8(env, value, NULL, 0, &str_buffer_size);
str_buffer = (char*)calloc(str_buffer_size + 1, sizeof(char));
size_t str_result;
napi_get_value_string_utf8(env, value, str_buffer, str_buffer_size, &str_result);
str_found = true;
if (*str_buffer == '[=13=]') {
free(str_buffer);
str_found = false;
continue;
}
}
napi_set_element(env, output_array, result_index, value);
result_index++;
if (str_found) free(str_buffer);
}
return output_array;
}
static napi_value Init(napi_env env, napi_value exports) {
napi_status status;
DECLARE_WITH_STATUS_CHECK(1, "compact", compact)
return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
我不明白的是,预期的输出应该包含除 false
和 ''
之外的所有值。但它似乎也跳过 '0'
和 '2'
,这意味着数字字符。我通过在它后面添加另一个数字 ('01'
) 来测试它,然后它就可以工作了。
为什么会这样?为什么 C
会跳过单个字符数字?我怎样才能得到我的预期输出?
提前致谢。
我在深入研究 Node.js 源代码并进行此更改后解决了这个问题,
我换了,
napi_get_value_string_utf8(env, value, str_buffer, str_buffer_size, &str_result);
和
napi_get_value_string_utf8(env, value, str_buffer, str_buffer_size + 1, &str_result);
将1
添加到str_buffer_size
简单地解决了问题。但我不明白为什么,但它还是解决了我的问题。