【发布时间】: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