【问题标题】:Failed to load c++ bson extension无法加载 c++ bson 扩展
【发布时间】:2014-03-06 13:22:30
【问题描述】:

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

节点应用

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)

【问题讨论】:

  • 错误是failed to connect to,所以我认为bson消息可能无关,实际上并不重要。你确定你的 Mongo 连接设置正确吗?
  • 有趣的故事我只在 Windows 机器上收到此错误...尚未尝试安装 node-gyp 但我尝试了几乎所有其他方法但仍然收到错误。并且 chocoletey 不会安装构建要素
  • 现在的 JS BSON 代码不是几乎和 C++ 一样快了吗?如果是这样,这真的是个问题吗?
  • 对于新 iojs 上遇到此问题的人,我已开票跟踪此问题:github.com/mongodb/js-bson/issues/136
  • 注意:我使用 Keystone.js 作为我的 mvc 框架。对我来说,您将“../build/Release/bson”更改为“../browser_build/bson”。如果你上去,你会看到 browser_build 文件夹。

标签: javascript node.js express mongoose dependencies


【解决方案1】:

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

检查事项:

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

【讨论】:

  • 这是有用的信息。这样一来,我发现我将 mongolab 用户帐户信息与数据库的实际 mongodb 用户信息混为一谈。
  • 嗯,我遇到了同样的问题。一切都在我的本地测试服务器上运行,我使用的是 mongoHQ,所以不需要本地 mongo 实例,还有什么问题?
  • 算了,下面 Pradeep 的回答解决了这个问题:)
【解决方案2】:

如果 bson 扩展不是原因,我猜“连接失败”的另一个原因是用户 ID。所以我创建了一个新数据库并为该数据库添加了一个用户,并为该用户设置了密码(注意:不是 mongolab 帐户密码)。 我更新了我的代码,瞧!有效。对吗? :D

【讨论】:

    【解决方案3】:

    我猜你在安装 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
    

    【讨论】:

    • +1。我所要做的就是最后 3 行 - 我认为我没有构建我的原因是因为它是 mongoskin 模块的一部分。
    • 哇! sudo apt-get install gcc make build-essential 技巧是我见过的最好的 Node.js + Ubuntu 开发技巧之一。如果您习惯于开发 Web 应用程序并且只是在 Ubuntu 上使用 Node.js 进行开发,那么它绝对会改变游戏规则。
    • gcc 和make 与build-essential 一起安装的原因是什么?后者取决于另外两个,因此无论如何都要安装它们(packages.ubuntu.com/trusty/build-essential)。做sudo apt-get install build-essential 就足够了。
    • 在windows上怎么样??我在 Windows 命令提示符 C:\Users\me>node C:\Users\me\Desktop\nodeproject\datagen.js { [错误:找不到模块 '../build/Release/bson' ] 代码:'MODULE_NOT_FOUND' } js-bson:无法加载 c++ bson 扩展,使用纯 JS 版本 { [错误:找不到模块 '../build/Release/bson'] 代码:'MODULE_NOT_FOUND'} js-bson:加载c++ bson扩展失败,使用纯JS版本正确连接到服务器
    • 窗机呢:(
    【解决方案4】:

    我刚刚解决了。

    当你通过 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 模块。

    【讨论】:

    • 更改 node_modules 目录中的内容是个好主意吗?这似乎很脆弱
    • @DouglasFerguson 不是真的。如果您编辑 node_module,我建议您分叉 repo 并通过 npm/bower 安装修改后的模块。
    • 这个答案有效。 Mongoose 的开发人员,请修复此问题!
    • 这是一个 hack,而不是修复。
    • 这不是解决方案。使用相同的结果,您可以删除打印错误的字符串。出现此错误是因为找不到 bson 的原生 c++ 插件,在这种情况下无论如何都会使用 js 实现。
    【解决方案5】:

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

    npm install -g node-gyp
    

    然后

    npm update
    

    【讨论】:

    • 我通过运行npm update 解决了我的问题,甚至没有安装任何其他东西。
    【解决方案6】:

    我无法解决这个问题

    直到现在。首先,您必须拥有 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 update 是有风险的。它更新所有模块,这可能很危险(有时版本之间的 API 更改)。

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

    node-gyp rebuild
    

    这为我解决了问题。

    【讨论】:

    • windows 怎么样 :(
    • @JamieHutber 安装 VS 2013
    • 我在 512MB RP1 上发布了 DietPi。只是想提一下,我必须安装 Python (apt-get install python),然后在 node_modules/mongoose/node_modules/mongodb/node_modules/bson/ 中运行 make。这创建了Release/bson.node。
    【解决方案7】:

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

    我使用了猫鼬连接。

    我有这个:

    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”!只是 Mongoose 和 connect-mongo。

    【讨论】:

      【解决方案8】:

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

      sudo npm update 
      

      在我的节点项目的顶级文件夹中。这解决了问题,一切都像新的一样

      【讨论】:

        【解决方案9】:

        我也遇到了同样的问题,我是 Mac OSX 用户。基本上,您需要确保已安装 Xcode 以及 Xcode 中的“命令行工具”。

        Xcode 是免费的,可以在这里下载: https://developer.apple.com/xcode/downloads/

        安装 Xcode 后,打开它并单击下拉菜单中的“首选项”,然后单击“下载”图标。确保您已安装“命令行工具”。

        然后像上面提到的所有其他用户一样运行以下命令:

        rm -rf node_modules
        npm cache clean
        npm install
        

        【讨论】:

          【解决方案10】:

          所以在我的例子中,我首先尝试在这个目录下检查 /node_modules/mongoose/node_modules/,只是为了确认我有 bson 模块。 我发现我一开始没有它,然后我就跑了

          npm install bson 

          然后

          npm 更新

          所有都已排序。在 Ubuntu 中尝试和测试。

          【讨论】:

          • 也为我工作,但我也在/devel/node_modules/bson/ 中输入了make
          • 为我工作。没有清理 npm 缓存。实际上,我所做的只是从 /node_modules/mongoose 运行 npm install bson
          【解决方案11】:

          一个常见的问题是 node-gyp 需要 Python 2.x,如果您的系统的 python 指向 3.x,它将无法编译 bson,而不会发出警告。你可以通过在你的 npm 配置中设置一个python 全局键来解决这个问题,它指向你系统上的 2.x 可执行文件。例如,在 Arch Linux 上:

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

          【讨论】:

            【解决方案12】:

            对我来说只需要在我的 api 目录中运行这些命令:

            rm -rf node_modules
            npm cache clean 
            npm install
            

            【讨论】:

              【解决方案13】:

              我正在运行 Ubuntu 14.04,要为我修复它,我必须为 node 创建一个符号链接以指向 nodejs,如下所述:

              nodejs vs node on ubuntu 12.04

              一旦我这样做了,我就重新运行了这些命令:

              rm -rf node_modules
              npm cache clean
              npm install
              

              【讨论】:

              • 伟大的安东尼!我也在 Ubuntu 14.04 上运行,你的建议为我解决了这个问题。仅安装 build-essential 并重新安装所有内容是不够的:我还必须添加“节点”ln。
              【解决方案14】:

              这是我在 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 回答的启发,但我必须先创建一个符号链接,否则重建失败。

              【讨论】:

                【解决方案15】:

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

                【讨论】:

                  【解决方案16】:

                  我通过更改第 10 行来修复它:

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

                  来自:

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

                  收件人:

                  bson = require('bson');
                  

                  【讨论】:

                  • 我猜那是让包使用纯js解决方案
                  • 我不是 100% 确定,但我知道这是在避免这种情况。
                  【解决方案17】:

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

                  我在全球范围内安装了mongoose——当然是sudo,一切都开始按预期工作。

                  附: kerberos 软件包现在也全局安装在 mongoose 旁边,但是我不记得我是否故意这样做了——当我试图解决问题时,或者它是否从一开始就存在。

                  【讨论】:

                    【解决方案18】:

                    我正在使用 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
                    

                    【讨论】:

                      【解决方案19】:

                      我刚刚跑了:

                      sudo npm install bson
                      

                      和

                      sudo npm update
                      

                      一切都会好起来的。

                      【讨论】:

                      • 你应该非常避免使用 sudo 权限运行 npm。
                      • 任何你可以避免在 sudo 空间中的东西,你都应该这样做。我不认为这会导致任何可怕的问题,这只是一个好习惯。这是一篇可能有帮助的文章(除了喜欢 John Papa 之外,不能保证它)。 johnpapa.net/how-to-use-npm-global-without-sudo-on-osx
                      【解决方案20】:
                      【解决方案21】:

                      我能够通过卸载并重新安装僧侣包来解决。 初始安装似乎有一个损坏的 mongodb/bson 依赖项。

                      【讨论】:

                        【解决方案22】:

                        在 ubuntu 14.04 上,我需要在 /usr/bin 中创建一个链接,因为 /usr/bin/env 正在寻找 /usr/bin/node。

                        ln -s /usr/bin/nodejs /usr/bin/node
                        

                        错误信息可以在每个目录的builderror.log中找到,所以对于信息:

                        bson@0.2.21 安装 /usr/local/lib/node_modules/mongodb/node_modules/mongodb-core/node_modules/bson (node-gyp 重建 2> builderror.log) || (0号出口)

                        查看此文件以获取有关确切问题的更多信息:

                        /usr/local/lib/node_modules/mongodb/node_modules/mongodb-core/node_modules/bson/builderror.log

                        【讨论】:

                          【解决方案23】:

                          很遗憾,以上所有答案都只对了一半。 花了很长时间才弄清楚..

                          通过 npm 安装 Mongoose 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
                          【解决方案24】:

                          我在尝试了这么多选项时遇到了同样的问题,但在我的平均应用程序文件夹中的最后一个 npm intall 有效。

                          【讨论】:

                            【解决方案25】:

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

                            【讨论】:

                              【解决方案26】:

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

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

                              加载 c++ bson 扩展失败

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

                              再次,这个错误是什么意思?

                              实际上,这甚至不是错误。你仍然可以使用猫鼬。但在这种情况下,不是快速原生实现 bson 模块,而是获得了速度较慢的 js-realization。

                              我看到了很多提示,例如:“edit path deep inside node_modules...”——这完全没用,因为它没有解决问题,只是关闭了错误消息。

                              【讨论】:

                                【解决方案27】:

                                我在 CentOS 上修复了这个问题

                                • sudo yum groupinstall "开发工具"
                                • sudo npm install -g node-gyp
                                • rm -r 节点模块
                                • npm 缓存清理
                                • npm 安装

                                【讨论】:

                                • @Theja 说这个错误只发生在 Windows 机器上。
                                【解决方案28】:

                                只是想说我也有错误

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

                                但没有其他错误。我尝试了所有方法,结果发现我在 package.json 文件中指定的 mongodb 驱动程序与我的 MongoDB 版本不兼容。我将它更改为我的最新版本(1.4.34)并且它有效!!!

                                【讨论】:

                                • 确实 npm install mongodb@latest 为我解决了问题
                                【解决方案29】:

                                就我而言,我在本地机器(Mac)上npm install所有模块,并且我没有在.gitignore中包含node_modules并上传到github。然后我将项目克隆到我的aws,如您所知,它正在运行Linux,所以我得到了错误。我所做的只是在.gitignore 中包含node_modules,并在我的aws 实例中使用npm install,然后它就可以工作了。

                                【讨论】:

                                  【解决方案30】:

                                  sudo npm rebuild 为我解决了这个问题。

                                  【讨论】:

                                    猜你喜欢
                                    • 2015-06-17
                                    • 2015-08-30
                                    • 2014-04-05
                                    • 2014-06-05
                                    • 2014-06-03
                                    • 2015-08-27
                                    • 2015-03-06
                                    相关资源
                                    最近更新 更多