从不同的节点插件方法多次调用JS函数

时间:2019-07-04 12:43:18

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

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

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

我已尝试调查此问题。对于napi_typeof中的回调值,对MyAddonMethod的调用也返回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

1 个答案:

答案 0 :(得分:0)

我终于发现自己在做什么错。两次通话之间无法存储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释放引用时,您应该不要忘记。