首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Node-API将JavaScript数字作为字符串获得

如何使用Node-API将JavaScript数字作为字符串获得
EN

Stack Overflow用户
提问于 2022-01-23 05:51:24
回答 1查看 175关注 0票数 0

我正在使用Node.js构建一个节点-API插件。

逻辑简化如下,

将js数组传递到插件中,并获得一些过滤后的数组作为输出。

在加号内,算法将跳过任何空字符串和假值。

下面是使用的代码片段。这里有一个完整的副词:https://replit.com/@dinindu/node-api-addon-compact#addon.c

代码语言:javascript
复制
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"]
代码语言:javascript
复制
// 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 == '\0') {
        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要跳过单个字符号?我怎样才能得到预期的产出呢?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-23 07:31:20

我在挖掘Node.js源代码并做了这个修改之后,解决了这个问题。

我替换了,

代码语言:javascript
复制
napi_get_value_string_utf8(env, value, str_buffer, str_buffer_size, &str_result); 

使用

代码语言:javascript
复制
napi_get_value_string_utf8(env, value, str_buffer, str_buffer_size + 1, &str_result);

1添加到str_buffer_size只是解决了这个问题。但我不明白为什么,但它还是解决了我的问题。

这帮我解决了这个问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70819487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档