Node.js N-API模块报错:Module did not self-register 求助
解决Node.js N-API模块"Module did not self-register"报错
我之前也碰到过这个报错,结合你的代码和报错栈来看,主要问题出在N-API初始化函数的签名上,再给你几个其他可能的排查方向:
1. 修正初始化函数的签名(最关键)
你的Init函数签名不符合N-API的要求,NAPI_MODULE宏期望的初始化函数只需要接收napi_env和napi_value exports两个参数,并且要返回处理后的exports对象。
你当前的代码里,Init函数是void类型还多了两个参数,这会导致模块无法正确注册到Node环境中。把它改成这样:
#include <node_api.h> napi_value HelloMethod(napi_env env, napi_callback_info info) { napi_value world; napi_create_string_utf8(env, "world", 5, &world); return world; } napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor desc = { "hello", NULL, HelloMethod, NULL, NULL, NULL, napi_default, NULL }; napi_define_properties(env, exports, 1, &desc); return exports; // 必须返回exports对象 } NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
2. 彻底清理后重新编译
改完代码后,一定要清理旧的编译产物再重新编译,避免残留的旧文件导致问题:
# 清理旧编译文件 node-gyp clean # 重新配置并编译 node-gyp configure build
3. 检查Node.js版本一致性
如果编译模块时用的Node版本和你运行时的版本不一样,也可能出现这个报错。你可以用下面的命令确认版本:
# 查看当前运行的Node版本 node -v # 查看node-gyp关联的Node版本 node-gyp -v
如果版本不一致,切换到相同版本后再重新编译。
4. 确认系统架构匹配
还要确保你的Node.js和编译环境的架构一致(都是64位或者都是32位):
# 查看Node的架构 node -p process.arch # 查看系统架构(Linux/macOS) uname -m # Windows下可以用这个命令 systeminfo | findstr "System Type"
如果架构不匹配,安装对应架构的Node后重新编译即可。
最后验证一下:编译完成后,在Node里运行这段代码,应该能正常输出"world":
const addon = require('./build/Release/addon'); console.log(addon.hello());
内容的提问来源于stack exchange,提问作者bingxl
相关产品推荐
相关产品推荐

