Không thể tải phần mở rộng c ++ bson


185

Tổng số nút noob ở đây. Tôi đã cố gắng thiết lập một ứng dụng nút mẫu nhưng lỗi sau vẫn xuất hiện mỗi khi tôi cố chạy:

ứng dụng nút

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
Lỗi là failed to connect to, vì vậy tôi nghĩ rằng bsontin nhắn có thể không liên quan và không thực sự quan trọng. Bạn có chắc cài đặt kết nối Mongo của bạn là chính xác?
loganfsmyth

1
Câu chuyện vui tôi chỉ gặp lỗi này trên máy windows ... chưa thử cài đặt nút-gyp nhưng tôi đã thử hầu hết mọi thứ khác và vẫn gặp lỗi. và chocolateetey sẽ không cài đặt bản dựng thiết yếu
Snymax

Không phải mã JS BSON gần như nhanh như C ++ bây giờ sao? Nếu vậy, đây thực sự là một vấn đề?
UpTheCalet

Đối với những người trên iojs mới hơn gặp phải vấn đề này, tôi đã mở một vé để theo dõi vấn đề này: github.com/mongodb/js-bson/issues/136
bitinn

Lưu ý: Tôi đang sử dụng Keystone.js làm khung mvc của mình. Đối với tôi, bạn thay đổi "../build/Release/bson" thành "../browser_build/bson". Nếu bạn đi lên, bạn sẽ thấy thư mục browser_build.
Pranay Pant

Câu trả lời:


201

Tôi đoán bạn không có sẵn các công cụ khi bạn cài đặt thư viện mongodb của mình. Tôi đề nghị bạn làm

xcode-select --install(trên máy mac) hoặc sudo apt-get install gcc make build-essential(trên Ubuntu)

và chạy

rm -rf node_modules
npm cache clean
npm install

HOẶC chỉ cập nhật npm dựa trên nhận xét @tobias (sau khi cài đặt bản dựng)

npm update

2
+1. Tất cả những gì tôi phải làm là 3 dòng cuối cùng - tôi nghĩ lý do tôi không được xây dựng là vì nó là một phần của mongoskinmô-đun.
Matt Browne

2
sudo apt-get install gcc make build-essentialMẹo đó là một trong những mẹo phát triển Node.js + Ubuntu tốt nhất tôi từng thấy. Đây là một công cụ thay đổi trò chơi tuyệt đối nếu bạn quen phát triển các ứng dụng web và chỉ phát triển với Node.js trên Ubuntu.
Charney Kaye

3
Lý do cài đặt gccmakecùng với là build-essentialgì? Cái sau phụ thuộc vào hai cái còn lại vì vậy chúng sẽ được cài đặt bằng mọi cách ( gói.ubfox.com/trusty/build-essential ). Làm sudo apt-get install build-essentialnên là đủ.
Serge

8
Còn trên windows thì sao ?? Tôi đang nhận được một cái gì đó như thế này trên dấu nhắc lệnh windows của tôi C: \ Users \ me> nút C: \ Users \ me \ Desktop \ gậteproject \ datagen.js {[Error: Không thể tìm thấy mô-đun '../build/Release/bson' ] code: 'MODULE_NOT_FOUND'} js-bson: Không thể tải tiện ích mở rộng c ++ bson, sử dụng phiên bản JS thuần túy {[Error: Không thể tìm thấy mô-đun '../build/Release/bson'] code: 'MODULE_NOT_FOUND'} js-bson: Không thể tải tiện ích mở rộng c ++ bson, sử dụng phiên bản JS thuần túy Được kết nối chính xác với máy chủ
ULLAS K

1
Còn máy cửa sổ thì sao :(
Jamie Hutber

100

Tôi chỉ giải quyết mà.

Khi bạn cài đặt mô đun mongoose trước npm, nó không có mô đun bson dựng sẵn trong thư mục của nó. Trong tệp node_modules/mongoose/node_modules/mongodb/node_modules/bson/ext/index.js, thay đổi dòng

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

đến

bson = require('bson');

và sau đó cài đặt mô-đun bson bằng cách sử dụng npm.


36
có phải là một ý tưởng tốt để thay đổi mọi thứ trong thư mục node_modules? Điều đó có vẻ dễ vỡ
Douglas Ferguson

6
@DoumundFerguson Không thực sự. Nếu bạn chỉnh sửa node_module, tôi khuyên bạn nên hủy repo và cài đặt mô-đun đã sửa đổi của mình thông qua npm / bower.
Christopher Marshall

4
Câu trả lời này đã làm việc. Devs tại Mongoose, xin vui lòng sửa lỗi này!
Steve K

23
Đây là một hack, không phải là một sửa chữa.
Ashesh

10
Đây không phải là một giải pháp. Với kết quả tương tự, bạn có thể loại bỏ các chuỗi in lỗi. Lỗi này xuất hiện do không tìm thấy plugin c ++ gốc cho bson và trong trường hợp này, js nhận ra sẽ được sử dụng.
Alendorff

36

Tôi đã sắp xếp vấn đề nhận "Không thể tải phần mở rộng c ++ bson" trên raspbian (debian cho mâm xôi) bằng cách:

npm install -g node-gyp

và sau đó

npm update

3
Tôi đã giải quyết vấn đề của mình chỉ bằng cách chạy npm update, thậm chí không cài đặt bất cứ thứ gì khác.
MalcolmOcean

27

Tôi đã không thể giải quyết điều này

cho đến bây giờ Trước hết, bạn phải có các gói hệ thống được đề cập bởi Pradeep Mahdevu. Những người đang có:

xcode-select --install (on a mac) 

hoặc là

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

Sau đó, tôi đã cài đặt nút-gyp

npm install -g node-gyp 

như datadracer đã nói nhưng cập nhật npm cũng được anh gợi ý là rất mạo hiểm. Nó cập nhật tất cả các mô-đun, có thể nguy hiểm (đôi khi thay đổi API giữa các phiên bản).

Tôi đề nghị đi vào thư mục node_modules / mongodb / node_modules / bson và từ đó sử dụng

node-gyp rebuild

Điều đó đã giải quyết vấn đề cho tôi.


5
Còn về windows :(
Jamie Hutber 18/05/2015

@JamieHutber Cài đặt VS 2013
Rahil Wazir

Tôi đã làm điều này trên một bản phát hành DietPi trên RP1 512 MB. Chỉ muốn đề cập rằng tôi phải cài đặt Python ( apt-get install python) và sau đó từ bên trong node_modules/mongoose/node_modules/mongodb/node_modules/bson/chạy make. Điều này tạo ra Release/bson.node.
staticboy

20

Một vấn đề phổ biến là nút-gyp yêu cầu Python 2.x và nếu hệ thống của bạn pythontrỏ đến 3.x, nó sẽ không biên dịch được bson, mà không có cảnh báo. Bạn có thể khắc phục điều này bằng cách đặt pythonkhóa toàn cục trong cấu hình npm của bạn trỏ đến tệp thực thi 2.x trên hệ thống của bạn. Ví dụ: trên Arch Linux:

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

19

Vào THẮNG 8.1

Có vẻ như tôi đã sử dụng một phiên bản mongoose sai trong package.jsontập tin của mình .

Tôi xóa dòng "mongoose" : "^3.8.15"từ package.json.

CLI:

npm install mongoose --save

Bây giờ nó nói "mongoose": "^4.0.6"trong package.jsonvà lỗi tôi đã biến mất.


Cảm ơn bạn! Bạn đã cứu tôi khỏi vô số giờ đập đầu vào bàn phím. Đây là giải pháp cuối cùng và duy nhất hoạt động trên windows. Vấn đề là tôi đang chạy phiên bản 3.x của cầy mangut dường như không tương thích với bản cài đặt mongodb mới nhất trên máy tính của tôi.
Thử thách Được chấp nhận

Điều này cuối cùng cũng khiến tôi chạy trên Ubuntu.
Jason Kennaly

Vâng, chạy trên Mac là tốt. Cảm ơn!
jos

Cảm ơn nhiều! Theo dõi khóa đào tạo "Bạn đã có tài liệu! Bắt đầu nhảy" của Microsoft và có cùng một lỗi, chỉ liên quan đến gói mongodb - đã thực hiện các bước trên cho điều đó và chắc chắn, giờ nó đang chạy! :)
Fernando Madruga

11

Tôi đang chạy Ubuntu 14.04 và để sửa nó cho tôi, tôi đã phải tạo một liên kết tượng trưng cho nút để trỏ đến nodejs như được mô tả ở đây:

nodejs vs nút trên Ubuntu 12.04

Khi tôi đã làm điều đó, tôi chạy lại các lệnh này:

rm -rf node_modules
npm cache clean
npm install

Anthony tuyệt vời! Tôi cũng đang chạy trên Ubuntu 14.04 và đề xuất của bạn đã giải quyết vấn đề cho tôi. Nó không đủ để cài đặt build-Essential và cài đặt lại mọi thứ: Tôi cũng phải thêm 'nút' ln.
Franco

8

Vì vậy, trong trường hợp của tôi, trước tiên tôi đã thử kiểm tra trong thư mục này / node_modules / mongoose / node_modules / , chỉ để xác nhận rằng tôi có mô-đun bson . Tôi nhận ra rằng tôi đã không có nó ở nơi đầu tiên, sau đó tôi chỉ chạy

npm cài đặt bson 

và sau đó

cập nhật npm

Tất cả đã được sắp xếp. Đã thử và thử nghiệm trong Ubuntu.


cũng làm việc cho tôi, nhưng tôi cũng đã gõ makevào/devel/node_modules/bson/
exebook

1
Đã làm cho tôi. Làm sạch bộ đệm npm không. Trên thực tế, tất cả những gì tôi đã làm là từ / node_modules / mongoose chạynpm install bson
RichieRich

8

chỉ muốn nói tôi cũng có lỗi

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

Nhưng không có lỗi nào khác. Tôi đã thử tất cả mọi thứ và hóa ra các trình điều khiển mongodb mà tôi đã chỉ định trong tệp pack.json không tương thích với phiên bản MongoDB của tôi. Tôi đã thay đổi nó thành phiên bản mới nhất của tôi (1.4.34) và nó đã hoạt động !!!


thực sự npm cài đặt mongodb @ mới nhất đã giải quyết cho tôi vấn đề
tam.teixeira


8

Cuối cùng tôi đã khắc phục lỗi này bằng cách cập nhật phiên bản phụ thuộc MongoDB tôi để ~ 2.0.36 trong package.json.

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

Của tôi hơi liên quan, tôi đã sử dụng mongod, và không phải mobgo db .
Brad B

5

Thật không may, tất cả các câu trả lời trên chỉ đúng một nửa .. Mất một thời gian dài để tìm ra điều này ..

Mongoose bson cài đặt qua npm ném cảnh báo và gây ra lỗi ...

npm install -g node-gyp

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

Điều này hoạt động như ma thuật !!


Điều này không thành công với lỗi:$ 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

4

Đối với tôi, chỉ cần chạy các lệnh này trong thư mục api của tôi:

rm -rf node_modules
npm cache clean 
npm install

4

Tôi vừa chạy:

sudo npm install bson

sudo npm update

và tất cả trở nên ok


Bạn nên tránh chạy npm với quyền sudo.
loganhuskins

Bất cứ điều gì bạn có thể tránh có trong không gian sudo, bạn nên. Tôi không nghĩ rằng nó sẽ gây ra bất kỳ vấn đề nghiêm trọng nào, đó chỉ là một thực hành tốt. Đây là một bài viết có thể giúp ích (không thể bảo đảm cho nó ngoài việc thích John Papa). johnpapa.net/how-to-use-npm-global-without-sudo-on-osx
loganhuskins

3

Thông báo mở rộng bson chỉ là một cảnh báo , tôi nhận được nó mọi lúc trong ứng dụng nodejs của tôi.

Những điều cần kiểm tra:

  • Ví dụ MongoDB : Bạn có chạy phiên bản MongoDB không?
  • Cấu hình : Bạn đã cấu hình chính xác Mongoose cho phiên bản MongoDB của bạn chưa? Tôi nghi ngờ cấu hình của bạn sai, vì thông báo lỗi tạo ra một chuỗi rất kỳ lạ cho tên máy chủ máy chủ mongodb của bạn ..

Đó là thông tin hữu ích. Theo cách đó, tôi nhận ra rằng tôi đã trộn lẫn thông tin tài khoản người dùng mongolab với thông tin người dùng mongodb thực tế cho cơ sở dữ liệu.
Theja

Hmm, tôi đang gặp vấn đề tương tự. Mọi thứ đều hoạt động trên máy chủ thử nghiệm cục bộ của tôi và tôi đang sử dụng mongoHQ vì vậy không cần ví dụ mongo cục bộ, điều gì khác có thể xảy ra?
Karoh

Hãy quên điều đó đi, câu trả lời của Pradeep bên dưới đã giải quyết điều đó :)
Karoh

3

Tôi đã khắc phục sự cố này trên CentOS bằng cách

  • sudo yum nhóm cài đặt "Công cụ phát triển"
  • sudo npm cài đặt -g nút-gyp
  • rm -r node_modules
  • bộ nhớ cache npm
  • cài đặt npm

@Theja cho biết lỗi chỉ xảy ra trên máy Windows.
Pawel Veselov

3

Tôi đã sửa nó bằng cách thay đổi dòng 10 của:

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

từ:

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

đến:

bson = require('bson');

3
Đó là việc tạo ra gói để sử dụng giải pháp js thuần túy, tôi đoán
bolerovt

Tôi không chắc chắn 100%, nhưng tôi đã hiểu rằng tránh chính xác điều đó.
jorgefpastor

2

Tôi cũng gặp vấn đề này và nó khiến các phiên của tôi không hoạt động. Nhưng cũng không thể phá vỡ ...

Tôi đã sử dụng một kết nối cầy mangut.

Tôi đã có điều này:

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

Rất đơn giản. Nhưng req.session vẫn luôn trống rỗng.

rm -rf node_modules
npm cache clean
npm install

Đã lừa Xem ra bạn không có 'mongodb' trong gói.json của bạn! Chỉ cần Mongoose và kết nối-mongo.


2

Đây là cách tôi khắc phục sự cố trên 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

Lấy cảm hứng từ câu trả lời @mbochynski, nhưng tôi phải tạo một liên kết tượng trưng trước, nếu không việc xây dựng lại thất bại.


2

tôi đã gặp rắc rối tương tự đã thử rất nhiều tùy chọn nhưng cuối cùng npm intalltrong thư mục ứng dụng trung bình của tôi đã hoạt động.


2

Tôi gặp vấn đề này vì tôi đã bao gồm thư mục node_modules trong kho Git của mình. Khi tôi xây dựng lại node_modules trên hệ thống khác, nó đã hoạt động. Một trong số họ đã chạy Linux, OS X khác. Có lẽ họ cũng có kiến ​​trúc bộ xử lý khác nhau.


1

Tôi đã có cùng một vấn đề trên ví dụ EC2 của tôi. Tôi nghĩ nguyên nhân ban đầu là do tôi có một phiên bản Node đang chạy khi tôi cài đặt Mongo. Tôi đã dừng dịch vụ Node và sau đó chạy

sudo npm update 

bên trong thư mục cấp cao nhất của dự án nút của tôi. Điều này đã khắc phục vấn đề và mọi thứ vẫn như mới


1

Tôi đã cố gắng để chạy nút trên thư mục chia sẻ máy ảo (vagrant). Đó là một vấn đề. Máy chủ của tôi là Windows, cài đặt nút trên Windows và hoạt động như một bùa mê. Vì vậy, nếu bạn đang sử dụng máy ảo, chỉ cần thử chạy máy chủ nút trên máy chủ.


1

Tôi chỉ có cùng một vấn đề và thực sự không có gì làm việc cho tôi. Các lỗi đã được hiển thị kerberoslà gây ra vấn đề và đó là một trong những mongoosephụ thuộc. Vì tôi đang sử dụng Ubuntu, tôi nghĩ rằng có thể có các vấn đề về quyền ở đâu đó giữa các gói được cài đặt trên toàn cầu - /usr/lib/node_modulesthông qua sudovà các gói trên không gian người dùng.

Tôi đã cài đặt mongoosetrên toàn cầu - với sudotất nhiên, và mọi thứ bắt đầu hoạt động như mong đợi.

PS kerberosGói bây giờ cũng được cài đặt trên toàn cầu bên cạnh mongoose, tuy nhiên tôi không thể nhớ nếu tôi đã cố tình làm điều đó - trong khi tôi đang cố gắng giải quyết vấn đề, hoặc nếu nó có ngay từ đầu.


1

Tôi đang làm việc trên Docker với centOS 7 và gặp phải vấn đề tương tự.

Sau khi xem xét xung quanh và thực hiện một vài lần thử, tôi đã khắc phục vấn đề này bằng cách cài đặt mongodb và mongodb-server

yum install mongodb mongodb-server

Tôi không nghĩ rằng đây là cách tốt nhất để sản xuất container tối thiểu. nhưng tôi có thể giới hạn phạm vi vào các gói sau

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

Tôi đã có thể giải quyết bằng cách gỡ cài đặt và cài đặt lại gói tu sĩ. Cài đặt ban đầu dường như có một phụ thuộc mongodb / bson bị hỏng.


1

Followint @ user1548357 Tôi quyết định tự thay đổi tệp mô-đun. Vì vậy, để tránh các vấn đề được chỉ ra bởi các bình luận hợp lệ bên dưới, tôi đã bao gồm các thay đổi của mình trong tập lệnh cài đặt sau để tôi có thể đặt nó và quên nó và yên tâm rằng nó sẽ chạy khi các mô-đun của tôi được cài đặt.

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

và kịch bản là:

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

dễ dàng giải quyết vấn đề bằng cách chỉ cần thêm dòng này cả thử và bắt đường dẫn khối: 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'); 

Đó là tất cả!!!


Chào, cảm ơn cho câu trả lời của bạn. Vui lòng sử dụng định dạng trên các ví dụ mã để mọi người dễ đọc hơn.
F_SO_K

1

Điều duy nhất giúp tôi trên Windows 7 (x64): https://stackoverflow.com/a/29714359/2670121

Cài đặt lại nút và python với các phiên bản x32.
Tôi đã dành rất nhiều thời gian với lỗi này:

Không thể tải phần mở rộng c ++ bson

và cuối cùng, khi tôi cài đặt mô-đun node-gyp(để xây dựng các addon gốc) và thậm chí cài đặt SDK Windows với studio trực quan - nodejs không nhận ra mô-đun lắp rápbson.node là một mô-đun. Sau khi cài đặt lại vấn đề đã biến mất.

Một lần nữa, lỗi này có nghĩa là gì?

Trên thực tế, nó thậm chí không có lỗi. Bạn vẫn có thể sử dụng cầy mangut. Nhưng trong trường hợp này, thay vì thực hiện bsonmô đun gốc nhanh , bạn đã nhận đượcjs-realization , tốc độ chậm hơn.

Tôi đã thấy nhiều mẹo như: "chỉnh sửa đường dẫn sâu bên trong node_modules ..." - điều này hoàn toàn vô dụng, vì nó không giải quyết được vấn đề, mà chỉ tắt các thông báo lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.