Falha ao carregar a extensão c ++ bson

185

Um nó total noob aqui. Eu tenho tentado configurar um aplicativo de nó de amostra, mas o erro a seguir aparece sempre que tento executar:

aplicativo de nó

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)
Theja
fonte
3
O erro é failed to connect to, então acho que essa bsonmensagem pode não estar relacionada e não ser realmente importante. Tem certeza de que as configurações de conexão do Mongo estão corretas?
Loganfsmyth
1
História engraçada Eu só recebo esse erro em uma máquina Windows ... ainda não tentei instalar o node-gyp, mas tentei quase todo o resto e ainda recebo o erro. e chocoletey não instalam fundamentos de compilação
Snymax 20/02/2015
O código JS BSON não é tão rápido quanto o C ++ agora? Se sim, isso é realmente um problema?
UpTheCreek 24/02
Para as pessoas em iojs mais recentes enfrentando esse problema, eu abri um bilhete para controlar este problema: github.com/mongodb/js-bson/issues/136
bitinn
Nota: Estou usando o Keystone.js como minha estrutura mvc. Para mim, você altera "../build/Release/bson" para "../browser_build/bson". Se você subir, verá a pasta browser_build.
Pranay Pant

Respostas:

201

Eu acho que você não tinha as ferramentas make disponíveis quando instalou sua biblioteca mongodb. Eu sugiro que você faça

xcode-select --install(em um mac) ou sudo apt-get install gcc make build-essential(no ubuntu)

e corra

rm -rf node_modules
npm cache clean
npm install

OU apenas atualização npm com base no comentário @tobias (após a instalação do build-essential)

npm update
Pradeep Mahdevu
fonte
2
+1. Tudo o que eu precisei fazer foram as três últimas linhas - acho que a razão pela qual a minha não foi construída foi porque ela veio como parte do mongoskinmódulo.
Matt Browne
2
Uau! Essa sudo apt-get install gcc make build-essentialdica é uma das melhores dicas de desenvolvimento do Node.js. + Ubuntu que eu já vi. É uma mudança de jogo absoluta se você está acostumado a desenvolver aplicativos da Web e apenas desenvolver com o Node.js. no Ubuntu.
Charney Kaye
3
Qual é o motivo da instalação gcce makejunto build-essential? O último depende dos outros dois, então eles serão instalados de qualquer maneira ( packages.ubuntu.com/trusty/build-essential ). Fazer sudo apt-get install build-essentialdeve ser suficiente.
Sergey
8
Que tal no windows ?? Estou recebendo algo assim no prompt de comando do Windows C: \ Users \ me> nó C: \ Users \ me \ Desktop \ nodeproject \ datagen.js {[Erro: Não foi possível encontrar o módulo '../build/Release/bson' ] código: 'MODULE_NOT_FOUND'} js-bson: falha ao carregar a extensão c ++ bson, usando a versão JS pura {[Erro: Não é possível encontrar o módulo '../build/Release/bson'] código: 'MODULE_NOT_FOUND'} js-bson: Falha ao carregar c ++ extensão bson, usando a versão JS puro conectado corretamente ao servidor
Ullas K
1
E as máquinas para janelas :(
Jamie Hutber
100

Eu apenas resolvi isso.

Quando você instala o módulo mangusto pelo npm, ele não possui um módulo bson embutido em sua pasta. No arquivo node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/index.js, altere a linha

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

para

bson = require('bson');

e instale o módulo bson usando o npm.

user1548357
fonte
36
é uma boa ideia mudar as coisas dentro do diretório node_modules? Isso parece frágil
Douglas Ferguson
6
@DouglasFerguson Na verdade não. Se você editar um node_module, sugiro que seja feito o repo e instale o módulo modificado via npm / bower.
Christopher Marshall
4
Essa resposta funcionou. Devs em Mongoose, conserte isso!
Steve K
23
Isso é um hack, não uma correção.
Ashesh
10
Esta não é uma solução. Com o mesmo resultado, você pode apenas remover as strings que imprimem erros. Este erro aparece devido ao plug-in c ++ nativo para bson não encontrado e, nesse caso, a realização do js será usada de qualquer maneira.
Alendorff
36

Eu resolvi o problema de obter a "Falha ao carregar a extensão c ++ bson" no raspbian (debian for raspberry) por:

npm install -g node-gyp

e depois

npm update
Daniele Urania
fonte
3
Resolvi meu problema apenas executando npm update, sem instalar mais nada.
precisa saber é o seguinte
27

Não consegui resolver isso

até agora. Antes de tudo, você precisa ter os pacotes de sistema mencionados por Pradeep Mahdevu. Esses são:

xcode-select --install (on a mac) 

ou

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

Então eu instalei o node-gyp

npm install -g node-gyp 

como o datadracer disse, mas a atualização da NPM também sugerida por ele é arriscada. Ele atualiza todos os módulos, o que pode ser perigoso (às vezes a API muda entre as versões).

Sugiro entrar no diretório node_modules / mongodb / node_modules / bson e, a partir daí, usar

node-gyp rebuild

Isso resolveu o problema para mim.

mbochynski
fonte
5
E quanto ao windows :(
Jamie Hutber
@JamieHutber Install VS 2013
Rahil Wazir
Eu estava fazendo isso em um lançamento do DietPi em um RP1 de 512 MB. Só queria mencionar que eu tinha que instalar o Python ( apt-get install python) e depois a partir da node_modules/mongoose/node_modules/mongodb/node_modules/bson/execução make. Isso criou Release/bson.node.
staticboy
20

Um problema comum é que o node-gyp requer o Python 2.xe se o sistema pythonapontar para 3.x, ele falhará na compilação bson, sem aviso prévio. Você pode corrigir isso definindo uma pythonchave global em sua configuração do npm que aponte para o 2.x executável em seu sistema. Por exemplo, no Arch Linux:

npm config -g set python "/usr/bin/python2"
neverfox
fonte
19

No WIN 8.1

Parece que usei uma versão errada do mangusto na minha package.json arquivo.

Eu removi a linha "mongoose" : "^3.8.15"de package.json.

CLI:

npm install mongoose --save

Agora ele diz "mongoose": "^4.0.6"em package.jsone o erro que eu tinha se foi.

Carvalho
fonte
Obrigado! Você me salvou de inúmeras horas batendo no teclado. Esta foi a última e única solução que funcionou no Windows. O problema foi que eu estava executando uma versão 3.x do mongoose que parecia ser incompatível com a última instalação do mongodb no meu pc.
ChallengeAccepted
Isso finalmente me fez rodar no Ubuntu também.
Jason Kennaly
Sim, rodando no Mac também. Obrigado!
jos
Muitíssimo obrigado! Após a sessão de treinamento "Você tem documentos! Um MongoDB Jump Start" da Microsoft e teve o mesmo erro, apenas relacionado ao pacote mongodb - executou as etapas acima para esse e, com certeza, agora está em execução! :)
Fernando Madruga
11

Estou executando o Ubuntu 14.04 e para corrigi-lo, tive que criar um link simbólico para o apontar para nodejs conforme descrito aqui:

nodejs vs node no ubuntu 12.04

Depois que fiz isso, executei novamente estes comandos:

rm -rf node_modules
npm cache clean
npm install
Anthony
fonte
Grande Anthony! Também estou executando o Ubuntu 14.04 e sua sugestão resolveu o problema para mim. Não basta instalar o essencial da compilação e reinstalar tudo: eu também tive que adicionar o 'node' ln.
Franco
8

Portanto, no meu caso, tentei primeiro verificar neste diretório / node_modules / mongoose / node_modules / , apenas para confirmar que tenho o módulo bson . Eu descobri que não tinha em primeiro lugar, então eu apenas corro

npm install bson 

e depois

atualização npm

Tudo foi organizado e testado no Ubuntu.

Steven
fonte
trabalhou para mim também, mas eu também digitado makeem/devel/node_modules/bson/
ExeBook
1
Trabalhou para mim. Limpar o cache npm não. Na verdade, tudo o que fiz foi de / node_modules / mongoose npm install bson
rodado
8

só queria dizer que também tive o erro

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

Mas com nenhum dos outros erros. Eu tentei de tudo e descobri que os drivers mongodb que eu especificava no arquivo package.json eram incompatíveis com a minha versão do MongoDB. Eu mudei para a minha versão mais recente (1.4.34) e funcionou !!!

o picles
fonte
fato npm instalar MongoDB @ última resolvido para mim o problema
tam.teixeira
8

sudo npm rebuild foi o que o corrigiu para mim.

Zach Dahl
fonte
8

Finalmente, corrigi esse erro atualizando minha versão da dependência do mongodb para ~ 2.0.36 in package.json.

 "dependencies": {
    "consolidate": "~0.9.1",
    "express": "3.x",
    "mongodb": "~2.0.36",
    "mongoose": "^4.1.12"
  }
Feezy23
fonte
O meu estava um pouco relacionado, eu estava usando o mongod, e não o mobgo db .
Brad B
5

Infelizmente, todas as respostas acima são apenas metade certas. Demorou muito tempo para descobrir isso.

Mongoose bson install via npm lança um aviso e causa o erro ...

npm install -g node-gyp

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

Isso funciona como mágica !!

Rama Prashanth
fonte
Isso falha com o erro:$ 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 7/16
4

Para mim, basta executar esses comandos no meu diretório api:

rm -rf node_modules
npm cache clean 
npm install
Adam Gądziak
fonte
4

Eu apenas corri:

sudo npm install bson

e

sudo npm update

e tudo fica bem.

V. Kovpak
fonte
Você deve evitar executar o npm com direitos sudo.
loganhuskins
Qualquer coisa que você possa evitar no espaço sudo, você deve. Eu não acho que isso causará problemas terríveis, é apenas uma boa prática. Aqui está um artigo que pode ajudar (não podemos garantir isso além de gostar de John Papa). johnpapa.net/how-to-use-npm-global-without-sudo-on-osx
loganhuskins
3

A mensagem de extensão bson é apenas um aviso , eu recebo o tempo todo no meu aplicativo nodejs.

Coisas a verificar:

  • Instância do MongoDB : você tem uma instância do MongoDB em execução?
  • Configuração : você configurou corretamente o Mongoose para sua instância do MongoDB? Eu suspeito que sua configuração está incorreta, porque a mensagem de erro cospe uma string muito estranha para o nome do host do servidor mongodb ..
hendrikswan
fonte
Essa foi uma informação útil. Com isso, descobri que estava misturando as informações da conta de usuário do mongolab com as informações reais do usuário do mongodb para o banco de dados.
Theja
Hmm, estou com o mesmo problema. No entanto, tudo estava funcionando no meu servidor de teste local e eu estou usando o mongoHQ, portanto, não há necessidade de uma instância local do mongo, o que mais poderia estar errado?
Karoh
esquecer que, a resposta de Pradeep abaixo resolvido que :)
Karoh
3

Corrigi esse problema no CentOS por

  • sudo yum groupinstall "Ferramentas de desenvolvimento"
  • sudo npm install -g node-gyp
  • rm -r node_modules
  • cache de npm limpo
  • instalação npm
liudong
fonte
@Theja disse que o erro só acontece na máquina Windows.
Pawel Veselov
3

Corrigi-o alterando a linha 10 de:

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

de:

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

para:

bson = require('bson');
jorgefpastor
fonte
3
Que está fazendo o pacote de usar a solução js puro, eu acho
bolerovt
Não tenho 100% de certeza, mas entendi que isso é evitar exatamente isso.
jorgefpastor
2

Eu também tive esse problema e isso fez com que minhas sessões não funcionassem. Mas para não quebrar também ...

Eu usei uma conexão de mangusto.

Eu tive isso:

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

Muito simples. Mas req.session permaneceu sempre vazio.

rm -rf node_modules
npm cache clean
npm install

Fiz o truque. Cuidado, você não tem um 'mongodb' no seu package.json! Apenas Mongoose e connect-mongo.

KLoozen
fonte
2

Aqui está como eu corrigi o problema no 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

Inspirado pela resposta @mbochynski, mas tive que criar um link simbólico primeiro, caso contrário, a reconstrução falhou.

collimarco
fonte
2

Eu estava tendo o mesmo problema tentei tantas opções, mas no último npm intallna minha pasta de aplicativos média funcionou.

ashishkumar148
fonte
2

Eu tive esse problema porque estava incluindo a pasta node_modules no meu repositório Git. Quando reconstruí o node_modules no outro sistema, ele funcionou. Um deles estava executando Linux, o outro OS X. Talvez eles também tivessem arquiteturas de processador diferentes.

marcmtlca
fonte
1

Eu tive o mesmo problema na minha instância do EC2. Acho que a causa inicial foi porque eu tinha uma instância do Node em execução quando instalei o Mongo. Parei o serviço Node e, em seguida, executei

sudo npm update 

dentro da pasta de nível superior do meu projeto de nó. Isso resolveu o problema e tudo parecia novo

Lloyd Banks
fonte
1

Eu estava tentando executar o nó na pasta compartilhada da máquina virtual (vagante). Isso foi um problema. Minha máquina host é o Windows, o nó instalado no Windows e funcionou como um encanto. Portanto, se você estiver usando uma máquina virtual, tente executar o servidor do nó na máquina host.

Lukas Liesis
fonte
1

Eu apenas tive o mesmo problema e literalmente nada funcionou para mim. O erro exibido estava kerberoscausando o problema e era uma das mongoosedependências. Como estou no Ubuntu, pensei que poderia haver problemas de permissão em algum lugar entre os pacotes instalados globalmente - /usr/lib/node_modulesviasudo e aqueles que estão no espaço do usuário.

Eu instalei mongooseglobalmente - comsudo naturalmente, e tudo começou a funcionar como esperado.

PS O kerberospacote agora também está instalado globalmente próximo a ele mongoose, no entanto, não me lembro se o fiz deliberadamente - enquanto tentava resolver o problema ou se estava lá desde o início.

Mahdi
fonte
1

Estou trabalhando no Docker com o centOS 7 e encontrei o mesmo problema.

depois de olhar em volta e fazer várias tentativas, corrigi esse problema instalando o mongodb e o mongodb-server

yum install mongodb mongodb-server

Não acho que essa seja a melhor maneira de produzir o contêiner mínimo. mas posso limitar o escopo nos seguintes pacotes

==============================================================================================================
 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
bolerovt
fonte
1

Consegui resolver desinstalando e reinstalando o pacote monk. A instalação inicial aparentemente tinha uma dependência corrompida do mongodb / bson.

johnkop
fonte
1

Followint @ user1548357 Decidi alterar o arquivo do módulo. Para evitar os problemas apontados pelos comentários válidos abaixo, incluí minhas alterações em um script pós-instalação para que eu possa defini-lo e esquecê-lo e ter certeza de que ele será executado quando meus módulos forem instalados.

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

e o script é:

// 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');
  });
});
Mike M
fonte
1

Para eliminar facilmente o problema, basta adicionar esta linha, tentar e pegar o caminho do bloco: 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'); 

Isso é tudo!!!

mallikarjuna gv
fonte
Oi, obrigado pela sua resposta. Use formatação em exemplos de código para facilitar a leitura das pessoas.
F_SO_K
1

A única coisa que me ajuda no Windows 7 (x64): https://stackoverflow.com/a/29714359/2670121

Reinstale o nó e o python com as versões x32.
Passei muito tempo com este erro:

Falha ao carregar a extensão c ++ bson

e finalmente, quando instalei o módulo node-gyp(para a criação de complementos nativos) e até instalei o SDK do Windows com o visual studio - o nodejs não reconheceu o módulo montadobson.node como um módulo. Depois de reinstalar o problema se foi.

Novamente, o que esse erro significa?

Na verdade, nem é um erro. Você ainda pode usar o mangusto. Mas, neste caso, em vez da rápida realização nativa do bsonmódulo, você conseguiu js-realization, o que é mais lento.

Eu vi muitas dicas como: "editar caminho no node_modules ..." - que é totalmente inútil, porque não resolve o problema, mas apenas desativou as mensagens de erro.

Alendorff
fonte