【问题标题】:Calling JS function multiple times from different node addon methods从不同的节点插件方法多次调用 JS 函数
【发布时间】:2019-07-04 12:43:18
【问题描述】:

我正在尝试使用 JS 回调来初始化我的节点插件模块以进行日志记录。 Initialize 方法旨在存储回调值,以便从其他方法调用。所以我使用napi_create_reference添加对回调的引用。

但是当我尝试从我的第二个插件方法MyAddonMethod 调用回调时,我收到napi_invalid_arg 错误。

我已尝试调查此问题。对来自MyAddonMethod 的回调值的napi_typeof 调用也返回napi_invalid_arg。尽管我有很强的参考,但似乎回调值被垃圾收集了。

我做错了什么? napi_create_reference 是否真的阻止了回调对象在插件调用之间被垃圾回收?

// JS side:
const addon = require('./addon.node');
function logCallbackFunction(logLine)
{
    console.log("Trace: " + logLine);
}
addon.Initialize(logCallbackFunction);
addon.MyAddonMethod();

// C++ side
// Initialize method:
napi_ref ref;
napi_create_reference(env, value, 1, &ref);
g_Value = value; // store the value somewhere between calls

// MyAddonMethod method: // "env" doesn't change from call to call
napi_valuetype type;
napi_status stat = napi_typeof(env, g_Value, &type); // napi_invalid_arg

【问题讨论】:

  • 我没有尝试过这样做,也没有直接使用 N-API(我坚持使用 C++ 和 node-addon-api)。但是您是否尝试过传递 2 而不是 1 的引用计数?文档没有说,但是已经有 1 个引用 - JavaScript 引用,所以如果 napi_create_reference 没有添加另一个,而只是使用 1 作为可能解释事情的 arg 传递。
  • 可能会发布更多代码 - 不清楚什么是值,也不清楚 g_Value 是什么。如果有足够的代码来编译它会更容易看。
  • 我肯定试过 2 而不是 1。结果是一样的。 g_Value 的类型为 napi_value。您是否尝试在节点插件调用之间保存对 js 函数/对象的引用?你用了什么node-addon-api方法?
  • 非常感谢您对@bmacnaughton 的支持!我仔细查看了 Napi::FunctionReference 内部,终于发现我做错了什么!除了引入它之外,它不符合使用插件方法中相同的value 的条件。而是应该使用 napi_get_reference_value 来提取相应的值。

标签: javascript c++ node.js-addon n-api


【解决方案1】:

我终于发现我做错了什么。在调用之间存储g_Value 是不合格的。相反,应该存储napi_ref 并使用napi_get_reference_value 函数来提取相应的值。所以 C++ 端代码应该是这样的:

// Initialize method:
napi_ref ref;
napi_create_reference(env, value, 1, &ref);
g_Ref = ref; // store the reference somewhere between calls

// MyAddonMethod method:
napi_value referenceValue;
napi_get_reference_value(env, g_Ref, &referenceValue);
napi_valuetype type;
napi_status stat = napi_typeof(env, referenceValue, &type); // napi_ok, napi_function

当然你不应该忘记在不再需要引用时使用napi_delete_reference 释放它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多