无法加载c ++ bson扩展


185

总节点菜鸟在这里。我一直在尝试设置示例节点应用程序,但是每次我尝试运行时都会弹出以下错误:

节点应用

Failed to load c++ bson extension, using pure JS version

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: failed to connect to [#$%67890 :27017]
    at null.<anonymous> (/home/thejazeto/code/nodejs/authen/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:553:74)
    at EventEmitter.emit (events.js:106:17)
    at null.<anonymous> (/home/thejazeto/code/nodejs/authen/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:140:15)
    at EventEmitter.emit (events.js:98:17)
    at Socket.<anonymous> (/home/thejazeto/code/nodejs/authen/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js:512:10)
    at Socket.EventEmitter.emit (events.js:95:17)
    at net.js:830:16
    at process._tickCallback (node.js:415:13)

3
错误是failed to connect to,因此我认为该bson消息可能无关,实际上并不重要。您确定您的Mongo连接设置正确吗?
loganfsmyth 2014年

1
有趣的故事我只在Windows机器上收到此错误...还没有尝试安装node-gyp,但是我尝试了几乎所有其他方法,但仍然收到错误。和chocoletey不会安装构建必需品
Snymax

JS BSON代码难道不和现在的C ++一样快吗?如果是这样,这真的有问题吗?
UpTheCreek

对于使用新iojs遇到此问题的人,我已打开一张票来跟踪此问题:github.com/mongodb/js-bson/issues/136
bitinn 2015年

注意:我使用Keystone.js作为我的mvc框架。对我来说,您将“ ../build/Release/bson”更改为“ ../browser_build/bson”。如果您向上走,则会看到browser_build文件夹。
Pranay Pant

Answers:


201

我猜您在安装mongodb库时没有make工具。我建议你做

xcode-select --install(在Mac上)或sudo apt-get install gcc make build-essential(在ubuntu上)

并运行

rm -rf node_modules
npm cache clean
npm install

或仅基于@tobias注释进行npm更新(安装build-essential后)

npm update

2
+1。我所要做的就是最后三行-我认为之所以没有建立我的原因是因为它是该mongoskin模块的一部分。
马特·布朗

2
哇!该sudo apt-get install gcc make build-essential技巧是我见过的最好的Node.js + Ubuntu开发技巧之一。如果您习惯于开发Web应用程序并且仅在Ubuntu上使用Node.js进行开发,那将是绝对的游戏规则改变。
Charney Kaye 2014年

3
什么是安装的原因gcc,并make连同build-essential?后者取决于其他两个,因此无论如何都要安装它们(packages.ubuntu.com/trusty/build-essential)。这样做sudo apt-get install build-essential就足够了。
谢尔盖

8
在Windows上怎么样?我在Windows命令提示符C:\ Users \ me> node C:\ Users \ me \ Desktop \ nodeproject \ datagen.js上得到了类似的内容{[错误:找不到模块'../build/Release/bson' ]代码:'MODULE_NOT_FOUND'} js-bson:使用纯JS版本无法加载c ++ bson扩展{[错误:找不到模块'../build/Release/bson']代码:'MODULE_NOT_FOUND'} js-bson:无法使用纯JS版本加载c ++ bson扩展名正确连接到服务器
ULLAS K

1
那么窗户机器呢:(
Jamie Hutber

100

我刚刚解决了。

当您通过npm安装mongoose模块时,它的文件夹中没有内置的bson模块。在文件中node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/index.js,更改行

bson = require('../build/Release/bson');

bson = require('bson');

然后使用npm安装bson模块。


36
更改node_modules目录中的内容是个好主意吗?这似乎很脆弱
Douglas Ferguson

6
@DouglasFerguson不是。如果您编辑一个node_module,我建议分叉仓库,并通过npm / bower安装修改后的模块。
Christopher Marshall

4
这个答案有效。猫鼬的开发人员,请解决此问题!
史蒂夫·K

23
这是黑客,而不是修复程序。
Ashesh

10
这不是解决方案。使用相同的结果,您只需要删除打印错误的字符串即可。由于未找到bson的本机c ++插件而出现此错误,因此无论如何都将使用js实现。
阿伦多夫,2015年

36

我通过以下方式对在raspbian(用于raspberry的debian)上获取“无法加载c ++ bson扩展名”的问题进行了排序:

npm install -g node-gyp

然后

npm update

3
我仅通过运行就解决了我的问题npm update,甚至没有安装其他任何东西。
MalcolmOcean 2015年

27

我无法解决这个问题

到现在。首先,您必须拥有Pradeep Mahdevu提到的系统软件包。那些是:

xcode-select --install (on a mac) 

要么

sudo apt-get install gcc make build-essential (on ubuntu)

然后我安装了node-gyp

npm install -g node-gyp 

像datadracer所说的,但他建议的npm更新也有风险。它会更新所有模块,这可能很危险(有时版本之间API会更改)。

我建议进入node_modules / mongodb / node_modules / bson目录,然后从那里使用

node-gyp rebuild

那为我解决了问题。


5
窗户呢:(
Jamie Hutber

@JamieHutber安装VS 2013
Rahil Wazir

我是在512MB RP1上的DietPi版本上执行此操作的。只是想提到我必须安装Pythonapt-get install python),然后再从node_modules/mongoose/node_modules/mongodb/node_modules/bson/run中安装make。这创造了Release/bson.node
staticboy 2015年

20

一个常见的问题是node-gyp需要Python 2.x,并且如果系统python指向3.x,它将在bson没有警告的情况下无法编译。您可以通过python在npm config中设置一个指向系统上的2.x可执行文件的全局密钥来解决此问题。例如,在Arch Linux上:

npm config -g set python "/usr/bin/python2"

19

在WIN 8.1上

看来我在我的猫鼬中使用了错误的版本 package.json档案中。

"mongoose" : "^3.8.15"从删除了该行package.json

CLI:

npm install mongoose --save

现在它说"mongoose": "^4.0.6"package.json,我的错误就消失了。


谢谢!您从无数小时的键盘重击中拯救了我。这是在Windows上运行的最后一个也是唯一的解决方案。问题是我运行的猫鼬版本3.x似乎与PC上安装的最新mongodb不兼容。
挑战

这终于使我也可以在Ubuntu上运行。
杰森·肯纳利

是的,也可以在Mac上运行。谢谢!
jos

谢谢一群!紧接着在Microsoft的“您已获得文档!MongoDB快速入门”培训课程之后,又遇到了相同的错误,仅与mongodb软件包有关-为该步骤执行了上述步骤,而且确实可以运行了!:)
Fernando Madruga

11

我正在运行Ubuntu 14.04,并且要为我修复它,我必须为节点创建一个符号链接,使其指向nodejs,如下所述:

Ubuntu 12.04上的nodejs vs节点

完成后,我重新运行以下命令:

rm -rf node_modules
npm cache clean
npm install

伟大的安东尼!我也在Ubuntu 14.04上运行,您的建议为我解决了这个问题。仅安装build-essential并重新安装所有内容是不够的:我还必须添加'node'ln。
佛朗哥2015年

8

因此,就我而言,我首先尝试在此目录/ node_modules / mongoose / node_modules /下进行检查,只是为了确认我具有bson模块。我发现我一开始没有它,然后我就跑步

npm安装bson 

然后

npm更新

所有的都经过排序,并在Ubuntu中进行了测试。


工作对我好,但我也输入make/devel/node_modules/bson/
exebook

1
为我工作。没有清理npm缓存。实际上,我所做的只是从/ node_modules / npm install bson
mongoose

8

只是想说我也有错误

Failed to load c++ bson extension, using pure JS version

但是没有其他错误。我尝试了一切,结果发现我在package.json文件中指定的mongodb驱动程序与我的MongoDB版本不兼容。我将其更改为最新版本(1.4.34),它可以正常工作!!!


确实npm install mongodb @ latest为我解决了问题
tam.teixeira


8

我终于通过更新我的MongoDB的依赖版本纠正了这个错误〜2.0.36package.json

 "dependencies": {
    "consolidate": "~0.9.1",
    "express": "3.x",
    "mongodb": "~2.0.36",
    "mongoose": "^4.1.12"
  }

我的关系不大,我使用的是mongod,而不是mobgo db
Brad B

5

不幸的是,以上所有答案仅是正确的一半。.花了很长时间才弄清楚这一点。

通过npm安装猫鼬bson会引发警告并导致错误...

npm install -g node-gyp

git clone https://github.com/mongodb/js-bson.git
cd js-bson
npm install
node-gyp rebuild

这就像魔术一样!!


这失败,并显示错误:$ node gyp rebuild module.js:341 throw err; ^ Error: Cannot find module '/private/tmp/js-bson/gyp' at Function.Module._resolveFilename (module.js:339:15) at Function.Module._load (module.js:290:25) at Function.Module.runMain (module.js:447:10) at startup (node.js:140:18) at node.js:1001:3
Thomas Modeneis,2016年



3

bson扩展消息只是一个警告,我一直在我的nodejs应用程序中得到它。

检查事项:

  • MongoDB实例:您是否正在运行MongoDB实例?
  • Config:您是否已将Mongoose正确配置为您的MongoDB实例?我怀疑您的配置错误,因为错误消息为您的mongodb服务器主机名吐出了一个非常奇怪的字符串。

那是有用的信息。通过这种方式,我发现我将mongolab用户帐户信息与数据库的实际mongodb用户信息混淆了。
Theja 2014年

嗯,我遇到了同样的问题。虽然一切都在我的本地测试服务器上运行,但是我使用的是mongoHQ,所以不需要本地mongo实例,还有什么问题吗?
卡罗(Karoh)2014年

忘记了这一点,
普拉德普

3

我通过以下方式在CentOS上解决了此问题:

  • sudo yum groupinstall“开发工具”
  • 须藤npm install -g node-gyp
  • rm -r node_modules
  • npm缓存清理
  • npm安装

@Theja说,该错误仅在Windows计算机上发生。
Pawel Veselov

3

我通过更改以下内容的第10行来解决此问题:

/node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/index.js 

从:

bson = require('../build/Release/bson');

至:

bson = require('bson');

3
我猜这使程序包使用纯js解决方案
bolerovt 2015年

我不确定100%,但是我知道那是在避免这种情况。
jorgefpastor 2015年

2

我也遇到了这个问题,这导致我的会话无法正常工作。但不要打破任何一个...

我使用猫鼬连接。

我有这个:

var mongoose = require('mongoose');
var express = require('express');
var cookieParser = require('cookie-parser');
var expressSession = require('express-session');
var MongoStore = require('connect-mongo')(expressSession);
...
var app = express();
app.set('port', process.env.PORT || 8080);
app.use(bodyParser);
mongoose.connect('mongodb://localhost/TEST');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
  console.log('MongoDB connected');
});


app.use(cookieParser());
app.use(expressSession({
  secret: 'mysecret',
  cookie: {
    maxAge: null,
    expires: moment().utc().add('days',10).toDate(),// 10 dagen
  },
  store: new MongoStore({
  db: 'TEST',
  collection: 'sessions',
}),

非常简单。但是req.session始终是空的。

rm -rf node_modules
npm cache clean
npm install

做到了。请注意,您的package.json中没有'mongodb'!只是猫鼬和connect-mongo。


2

这是我在Ubuntu上解决问题的方法:

  1. ln -s /usr/bin/nodejs /usr/bin/node
  2. npm install node-gyp
  3. cd node_modules/mongodb/node_modules/bson
  4. node-gyp rebuild

受到@mbochynski答案的启发,但我必须先创建一个符号链接,否则重建将失败。


2

我遇到了同样的麻烦,尝试了很多选择,但最后一次npm intall在我的平均应用程序文件夹中起作用了。


2

我遇到了这个问题,因为我将Git存储库中包含了node_modules文件夹。当我在另一个系统上重建node_modules时,它起作用了。其中一个运行Linux,另一个运行OSX。也许它们也具有不同的处理器体系结构。


1

我在EC2实例上遇到了同样的问题。我认为最初的原因是因为安装Mongo时运行了Node实例。我停止了Node服务,然后运行了

sudo npm update 

在我的节点项目的顶层文件夹中。这样就解决了问题,一切都变得很新


1

我试图在虚拟机(无用)共享文件夹上运行节点。那是个问题。我的主机是Windows,在Windows上安装了节点,并且像超级按钮一样工作。因此,如果您使用的是虚拟机,只需尝试在主机上运行节点服务器。


1

我只是遇到了同样的问题,而实际上对我没有任何作用。显示的错误kerberos是导致问题的原因,并且它是mongoose依赖性之一。由于我使用的是Ubuntu,因此我认为全局安装的软件包之间可能存在权限问题- /usr/lib/node_modules通过sudo)和用户空间中的。

我在mongoose全球范围内安装了- sudo当然,一切都按预期进行了。

PS该kerberos软件包现在也已全局安装在旁边mongoose,但是我不记得我是否有意这样做-在我试图解决问题时,还是从一开始就存在。


1

我在使用centOS 7的Docker上工作,遇到了同样的问题。

环顾四周并进行几次尝试后,我通过安装mongodb和mongodb-server解决了此问题

yum install mongodb mongodb-server

我认为这不是生产最小容器的最佳方法。但我可以将范围限制在以下软件包中

==============================================================================================================
 Package                          Arch              Version                          Repository          Size

==============================================================================================================
Installing:
 mongodb                          x86_64            2.6.5-2.el7                      epel                57 M
 mongodb-server                   x86_64            2.6.5-2.el7                      epel               8.7 M
Installing for dependencies:
 boost-filesystem                 x86_64            1.53.0-18.el7                    base                66 k
 boost-program-options            x86_64            1.53.0-18.el7                    base               154 k
 boost-system                     x86_64            1.53.0-18.el7                    base                38 k
 boost-thread                     x86_64            1.53.0-18.el7                    base                56 k
 gperftools-libs                  x86_64            2.1-1.el7                        epel               267 k
 libpcap                          x86_64            14:1.5.3-3.el7_0.1               updates            137 k
 libunwind                        x86_64            1.1-3.el7                        epel                61 k
 snappy                           x86_64            1.1.0-3.el7                      base                40 k


1

我能够通过卸载和重新安装和尚软件包来解决。初始安装似乎具有损坏的mongodb / bson依赖关系。


1

Followint @ user1548357我决定更改模块文件本身。为了避免出现以下有效注释所指出的问题,我将所做的更改包括在安装后脚本中,以便我可以对其进行设置并忘记它,并确保它会在安装模块时运行。

// package.json
"scripts": {
    // other scripts
    "postinstall": "node ./bson.fix.js"
},

脚本是:

// bson.fix.js
var fs = require('fs');
var file = './node_modules/bson/ext/index.js'
fs.readFile(file, 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  var result = data.replace(/\.\.\/build\/Release\/bson/g, 'bson');
  fs.writeFile(file, result, 'utf8', function (err) {
     if (err) return console.log(err);
     console.log('Fixed bson module so as to use JS version');
  });
});

1

只需添加以下行try和catch块路径即可轻松解决问题: node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/index.js

bson = require('bson');  instead 

bson = require('./win32/ia32/bson');
bson = require('../build/Release/bson'); 

就这些!!!


嗨,谢谢您的回答。请在代码示例上使用格式,以使它们更易于阅读。
F_SO_K

1

在Windows 7(x64)上唯一对我有帮助的东西:https : //stackoverflow.com/a/29714359/2670121

用x32版本重新安装node和python。
我花了很多时间解决这个错误:

无法加载c ++ bson扩展

最后,当我安装模块node-gyp(用于构建本机插件),甚至将Windows SDK与Visual Studio一起安装时,nodejs都无法将组装好的模块识别bson.node为模块。重新安装后,问题消失了。

同样,此错误是什么意思?

实际上,这甚至不是错误。您仍然可以使用猫鼬。但是在这种情况下,bson您得到的不是代替模块的快速本机实现,而是js-realization慢了。

我看到了许多提示,例如:“在node_modules内部的编辑路径很深...”-完全没有用,因为它不能解决问题,只是关闭了错误消息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.