未捕获的错误:模块未自注册

130

我尝试在nw.js(v0.12.0-alpha2)中使用node-vlc。当我没有使用nw.js启动我的应用程序时,它可以正常工作,但是当我使用nw.js启动它时,出现了以下错误:

未捕获的错误:模块未自注册,来源:/home/alexis/Bureau/dev/jukebox/node_modules/vlc/node_modules/ffi/node_modules/bindings/bindings.js(84)

我尝试使用nw-gyp的一些命令,但无法解决问题。我使用的操作系统是Ubuntu 14,64位。


7
请考虑标记Omar的答案,那解决了这个问题。 - Ionică Bizău
@IonicăBizău 我没有看到Omar的回答。 - Константин Ван
@КонстантинВан 这是这里最受欢迎的答案,也许显示名称已更改。 :) - Ionică Bizău
相关链接:错误:模块未自注册。 - ggorlen
15个回答

204

如果你已经升级了Node,那么npm rebuild可能会为你解决这个问题。


3
除非你确实需要root访问权限,否则一定不要使用sudo来运行此命令。如果不是处理全局安装的模块(这通常是不鼓励的),你就不需要root权限。 - gfxmonk
13
对我没有用,但是 rm -r node_modules 然后 npm install 解决了问题。 - Spc_555
1
不仅限于升级,还适用于重新安装npm和node等情况。 - Kevin
这并没有真正回答问题。问题出在哪里?我在 electronJS 的 web worker 中加载模块 'usb' 时遇到了错误。不知道它的含义,你能解释一下问题是什么吗? - PeterT
它没有起作用。实际上,这里的任何答案都对我没用。我正在一个Webpack Electron项目中使用drivelist。 - Tung
1
在同一进程中可能会加载模块多次的情况下(例如Electron,worker_threads),具有本机插件的模块需要“上下文感知”(请参见https://github.com/nodejs/node/blob/main/doc/api/addons.md#context-aware-addons)。您正在使用的模块很可能不是上下文感知的,导致抛出此错误。您不能将其视为模块的用户来解决此问题,模块本身需要修复。在大多数情况下,这似乎是一个相当小的更改:https://github.com/nodejs/node/issues/21783#issuecomment-429637117 - Stevie

68

对我而言: rm -r node_modules之后 npm install


24

我曾经遇到过类似的问题,解决方法是改变使用的 Node 版本。我原本使用的是 0.12.0,后来改用了 0.10.26

个人推荐使用 NVM 来管理 Node 版本。安装好 NVM 后,只需运行以下命令即可切换版本:

nvm use 0.10.26

或者将默认版本设置为0.10.26

nvm alias default 0.10.26

希望这对你有所帮助 - 我们遇到的问题来自不同的产品,但解决方案可能是相同的。


当我执行全局包但想要使用新的 Node 版本运行本地包时,这个修复方法帮了我。只需要在运行全局命令时切换版本即可。 - Collin Price

13

我遇到过类似的问题。

/Users/user/NodeAddons/bridge/node_modules/bindings/bindings.js:83 错误:模块未自注册。

我的情况是我正在制作一个C/C++插件,但我忘记导出这个插件,在我的main.cc文件中缺少了以下代码:

void Init(v8::Handle<v8::Object> exports) {
  NODE_SET_METHOD(exports, "method", method);
}

NODE_MODULE(method, Init);

希望这可以帮助其他人!谢谢 :)


很高兴为你感到开心(Y) :D - Aion
因此,Aion在文件末尾添加了NODE_MODULE宏,与您的相同,但在编译后无法加载该模块。我做错了什么?我想打开一个新问题,因此您的答案几乎与nodejs文档相同。NODE_MODULE后面没有分号。 - lukaswilkeer

4

我曾经在创建一个多文件的C++插件时遇到过这个问题。在我的binding.gyp文件中,我有以下代码:

"sources": ["src/*.cc", "src/*.h" ]

我的项目包含几个*.cc文件。然而,NODE_MODULE()宏仅在导入其余文件的一个文件中调用。但是node希望它被调用在源代码中第一个*.cc文件上。所以我不得不更改源代码,明确将该文件添加到开头。


3

对于我来说,npm rebuildnpm update没有生效。我必须删除node_modules文件夹并运行npm install来重新安装它们。


3

我也遇到了同样的问题,因为我使用sudo安装了两个模块... 删除node modules文件夹并以普通用户重新安装解决了这个问题。


1
太好了。我使用 chown 更改了文件夹的所有权,并在不使用 sudo 的情况下使用 npm 进行了重新安装。它起作用了。 - Asheesh

2

对我而言,运行npm update即可解决问题。


它可以这样做,但只有在包已过时的情况下才能这样做。它也会执行比所要求的更多的操作。npm rebuildrm -rf node_modules && npm i是正确的答案。 - Albin

2

我遇到了一个内部错误:模块未自注册

  1. 删除了 node_modules 文件夹
  2. 运行了 npm install

这样就可以正常工作了。


谢谢,那个有效。我已经更新了Node版本,需要删除node_module文件夹。 - Manish Carpenter

2

我在使用Snappy时遇到了这个错误。当时使用的是Node 11。我查看了Snappy的NPM页面https://www.npmjs.com/package/snappy,他们在上面列出了支持的Node版本。

删除node_modules文件夹 rm -rf node_modules ,然后使用正确版本的Node重新安装解决了问题。

在撰写本文时,他们支持Linux上的一个版本是Node 12。

nvm deactivate 11
nvm uninstall 11
nvm install 12
nvm use 12

问题已解决


这个问题的另一个原因:如果你正在使用pm2,那么在升级node后可能需要重新安装pm2。通过在没有pm2的情况下运行您的应用程序来测试是否是pm2的问题 node server.js, 然后再使用pm2:pm2 start server.js

更新Node.js后更新PM2的正确方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接