Не удалось загрузить расширение 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

1
Забавная история Я получаю эту ошибку только на машине с Windows ... не пытался установить нод-gyp, но я попробовал почти все остальное и все еще получаю ошибку. и chocoletey не будут устанавливать основы сборки
Snymax

Разве код JS BSON сейчас не так быстр, как C ++? Если это так, действительно ли это проблема?
UpTheCreek

Для людей с более новыми ioj, испытывающими эту проблему, я открыл билет для отслеживания этой проблемы: github.com/mongodb/js-bson/issues/136
bitinn

Примечание: я использую Keystone.js в качестве моей инфраструктуры MVC. Для меня вы меняете "../build/Release/bson" на "../browser_build/bson". Если вы поднимитесь, вы увидите папку browser_build.
Pranay Pant

Ответы:


201

Я полагаю, у вас не было инструментов make, доступных при установке библиотеки mongodb. Я предлагаю вам сделать

xcode-select --install(на Mac) или sudo apt-get install gcc make build-essential(на Ubuntu)

и беги

rm -rf node_modules
npm cache clean
npm install

ИЛИ просто обновление npm на основе комментария @tobias (после установки build-essential)

npm update

2
+1. Все, что мне нужно было сделать, - это последние 3 строки - я думаю, что моя причина не была построена, потому что она была частью mongoskinмодуля.
Мэтт Браун

2
Вот Это Да! Этот sudo apt-get install gcc make build-essentialсовет - один из лучших советов по разработке Node.js + Ubuntu, которые я когда-либо видел. Это абсолютно изменит правила игры, если вы привыкли разрабатывать веб-приложения и просто разрабатывать с Node.js в Ubuntu.
Чарни Кей

3
Какова причина установки gccи makeвместе с build-essential? Последнее зависит от двух других, поэтому они все равно будут установлены ( packages.ubuntu.com/trusty/build-essential ). Делать sudo apt-get install build-essentialдолжно быть достаточно.
Сергей

8
Как насчет окон? Я получаю что-то вроде этого в командной строке Windows C: \ Users \ me> узел C: \ Users \ me \ Desktop \ nodeproject \ datagen.js {[Ошибка: не удается найти модуль '../build/Release/bson' ] code: 'MODULE_NOT_FOUND'} js-bson: не удалось загрузить расширение c ++ bson с использованием чистой версии JS {[Ошибка: не удается найти модуль '../build/Release/bson'] code: 'MODULE_NOT_FOUND'} js-bson: Не удалось загрузить расширение c ++ bson, используя чистую версию JS. Правильно подключен к серверу
ULLAS K

1
А как насчет оконных машин :(
Джейми Хатбер

100

Я только что решил это.

Когда вы устанавливаете модуль mongoose с помощью npm, в его папке нет встроенного модуля bson. В файле node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/index.jsизмените строку

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

в

bson = require('bson');

и затем установите модуль bson, используя npm.


36
это хорошая идея, чтобы изменить вещи в каталоге node_modules? Это кажется хрупким
Дуглас Фергюсон

6
@DouglasFerguson Не совсем. Если вы отредактируете модуль node_module, я бы предложил разветвить репозиторий и установить ваш модифицированный модуль через npm / bower.
Кристофер Маршалл

4
Этот ответ сработал. Разработчики в Mongoose, пожалуйста, исправьте это!
Стив К

23
Это взломать, а не исправить.
Ашеш

10
Это не решение. С тем же результатом вы можете просто удалить строки, которые выводит ошибку. Эта ошибка появляется из-за того, что родной плагин c ++ для bson не найден, и в этом случае реализация js будет использоваться в любом случае.
Алендорф

36

Я разобрал проблему получения «Не удалось загрузить расширение b ++ c ++» на raspbian (debian для raspberry) следующим образом:

npm install -g node-gyp

а потом

npm update

3
Я решил свою проблему, просто запустив npm update, даже не установив ничего другого.
MalcolmOcean

27

Я не смог решить это

до нынешнего момента. Прежде всего, вы должны иметь системные пакеты, упомянутые Pradeep Mahdevu. Это:

xcode-select --install (on a mac) 

или

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

Тогда я установил узел-гип

npm install -g node-gyp 

как сказал datadracer, но предложенное им обновление npm рискованно. Обновляются все модули, которые могут быть опасны (иногда API меняется между версиями).

Я предлагаю пойти в каталог node_modules / mongodb / node_modules / bson и оттуда использовать

node-gyp rebuild

Это решило проблему для меня.


5
А как насчет окон :(
Джейми Хатбер,

@JamieHutber Install VS 2013
Рахиль Вазир

Я делал это на выпуске DietPi на 512 МБ RP1. Просто хотел упомянуть, что я должен был установить Python ( apt-get install python), а затем изнутри node_modules/mongoose/node_modules/mongodb/node_modules/bson/запустить make. Это создано Release/bson.node.
Статик

20

Распространенной проблемой является то, что node-gyp требует Python 2.x, и если ваша система pythonуказывает на 3.x, она не сможет скомпилироваться bsonбез предупреждения. Вы можете исправить это, установив pythonглобальный ключ в вашей конфигурации npm, который указывает на исполняемый файл 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 mongoose, которая оказалась несовместимой с последней установкой mongodb на моем компьютере.
Вызов

Это наконец заставило меня работать на Ubuntu.
Джейсон Кеннали

Да, работает и на Mac. Спасибо!
Джос

Огромное спасибо! После учебного сеанса Microsoft «Вы получили документы! Начало работы с MongoDB», в котором была та же ошибка, связанная только с пакетом mongodb, - выполнил вышеуказанные шаги для этого и, конечно же, теперь он запущен! :)
Фернандо Мадруга

11

Я использую Ubuntu 14.04, и чтобы исправить это, мне нужно было создать символическую ссылку для узла, чтобы он указывал на nodejs, как описано здесь:

nodejs против узла в Ubuntu 12.04

Как только я сделал это, я перезапустил эти команды:

rm -rf node_modules
npm cache clean
npm install

Великий Энтони! Я также работаю на Ubuntu 14.04, и ваше предложение решило проблему для меня. Недостаточно установить build-essential и переустановить все: мне также пришлось добавить «узел» ln.
Франко

8

Так что в моем случае я сначала попытался проверить в этом каталоге / node_modules / mongoose / node_modules / , просто чтобы убедиться, что у меня есть bson модуль . Я понял, что у меня его не было в первую очередь, потом я просто бегу

NPM установить BSON 

а потом

обновление npm

Все отсортировано. Испытано и протестировано в Ubuntu.


работал для меня , как хорошо, но я также напечатал makeв/devel/node_modules/bson/
exebook

1
Работал на меня. Очистка кеша npm - нет. На самом деле все, что я делал, было из / node_modules / mongoose npm install bson
run

8

просто хотел сказать, у меня тоже была ошибка

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

Но ни с одной из других ошибок. Я перепробовал все и оказалось, что драйверы mongodb, которые я указывал в файле package.json, были несовместимы с моей версией MongoDB. Я изменил его на мою последнюю версию (1.4.34), и это сработало !!!


действительно npm install mongodb @ latest решил для меня проблему
tam.teixeira


8

Я, наконец, исправил эту ошибку, обновив версию зависимости mongodb до ~ 2.0.36 в package.json.

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

Мой был немного связан, я использовал mongod, а не mobgo db .
Брэд Б

5

К сожалению, все приведенные выше ответы только наполовину. Потребовалось много времени, чтобы понять это.

Установка Mongoose bson через npm выдает предупреждение и вызывает ошибку ...

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
Томас Моденеис

4

Для меня достаточно выполнить эти команды в моем каталоге API:

rm -rf node_modules
npm cache clean 
npm install

4

Я только что побежал:

sudo npm install bson

и

sudo npm update

и все стало хорошо.


Вы должны избегать запуска npm с правами sudo.
loganhuskins

Вы должны избегать всего, что вы можете избежать в пространстве sudo. Я не думаю, что это вызовет какие-то ужасные проблемы, это просто хорошая практика. Вот статья, которая может помочь (не могу ручаться за это кроме симпатии Джона Папа). johnpapa.net/how-to-use-npm-global-without-sudo-on-osx
loganhuskins

3

Сообщение о расширении bson - это просто предупреждение , я все время получаю его в своем приложении nodejs.

Вещи, чтобы проверить:

  • Экземпляр MongoDB : у вас работает экземпляр MongoDB?
  • Config : Правильно ли вы настроили Mongoose для своего экземпляра MongoDB? Я подозреваю, что ваш конфиг неверен, потому что сообщение об ошибке выдает очень странную строку для имени хоста вашего сервера mongodb.

Это была полезная информация. Исходя из этого, я понял, что смешиваю информацию учетной записи пользователя mongolab с фактической информацией пользователя mongodb для базы данных.
Theja

Хм, я сталкиваюсь с той же проблемой. Все работало на моем локальном тестовом сервере, и я использую mongoHQ, поэтому мне не нужен локальный экземпляр mongo, что еще может пойти не так?
Карох

забудьте об этом, ответ Прадипа ниже решил это :)
Karoh

3

Я исправил эту проблему на CentOS

  • sudo yum groupinstall "Инструменты разработки"
  • sudo npm install -g node-gyp
  • rm -r node_modules
  • очистка кеша npm
  • установка npm

@ Theja сказал, что ошибка происходит только на машине Windows.
Павел Веселов

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

Я не уверен на 100%, но я понял, что избегаю именно этого.
jorgefpastor

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',
}),

Очень просто. Но требование всегда оставалось пустым.

rm -rf node_modules
npm cache clean
npm install

Сделал трюк. Обратите внимание, что в вашем package.json нет mongodb! Просто мангуст и коннект-монго.


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

У меня была эта проблема, потому что я включил папку node_modules в мой репозиторий Git. Когда я перестроил node_modules в другой системе, это сработало. Один из них работал под управлением Linux, другой - OS X. Возможно, у них были и другие процессорные архитектуры.


1

У меня была такая же проблема на моем экземпляре EC2. Я думаю, что первоначальная причина была в том, что у меня был запущен экземпляр Node, когда я установил Mongo. Я остановил службу Node, а затем побежал

sudo npm update 

внутри папки верхнего уровня моего проекта узла. Это решило проблему, и все было как новый


1

Я пытался запустить узел на общей папке виртуальной машины (бродяги). Это была проблема. Мой хост-компьютер - Windows, установленный узел на Windows и работал как шарм. Поэтому, если вы используете виртуальную машину, просто попробуйте запустить сервер узла на хост-машине.


1

У меня просто была такая же проблема, и буквально у меня ничего не получалось. Ошибка показала kerberos, вызывает проблему, и это было одной из mongooseзависимостей. Поскольку я работаю в Ubuntu, я подумал, что могут быть проблемы с разрешениями где-то между глобально установленными пакетами - /usr/lib/node_modulesчерезsudo и теми, которые находятся в пользовательском пространстве.

Я установил mongooseглобально - sudoконечно, и все стало работать как положено.

PS kerberosПакет теперь также установлен глобально рядом mongoose, однако я не могу вспомнить, сделал ли я это преднамеренно - когда я пытался решить проблему, или это было с самого начала.


1

Я работаю на Docker с CentOS 7, и столкнулся с той же проблемой.

осмотревшись и сделав несколько попыток, я исправил эту проблему, установив 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

Я смог решить, удалив и переустановив пакет monk. Первоначальная установка, по-видимому, имела поврежденную зависимость mongodb / bson.


1

Followint @ user1548357 Я решил изменить сам файл модуля. Чтобы избежать проблем, указанных в действительных комментариях ниже, я включил свои изменения в скрипт postinstall, чтобы я мог установить его, забыть и быть уверенным, что он будет работать после установки моих модулей.

// 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

легко избавиться от проблемы, просто добавив эту строку и попробуйте и поймать путь к блоку: 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

Переустановите узел и python с версиями x32.
Я провел много времени с этой ошибкой:

Не удалось загрузить расширение c ++ bson

и наконец, когда я установил модуль node-gyp(для создания нативных надстроек) и даже установил Windows SDK с visual studio - nodejs не распознал собранный модуль bson.nodeкак модуль. После переустановки проблема исчезла.

Опять же, что означает эта ошибка?

На самом деле, это даже не ошибка. Вы все еще можете использовать мангуст. Но в этом случае вместо быстрой нативной реализации bsonмодуля вы получаетеjs-realization , что медленнее.

Я видел много советов, таких как: «редактировать путь глубоко внутри node_modules ...» - что совершенно бесполезно, потому что это не решает проблему, а просто отключает сообщения об ошибках.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.