2012-01-11 21 views
78

Tôi đang sử dụng mongoose trong tập lệnh không có nghĩa là chạy liên tục và tôi đang đối mặt với vấn đề rất đơn giản nhưng tôi không thể tìm thấy câu trả lời; đơn giản chỉ cần đặt một khi tôi thực hiện một cuộc gọi đến bất kỳ chức năng mongoose gửi yêu cầu đến mongodb thể hiện nodejs của tôi không bao giờ dừng lại và tôi phải giết nó bằng tay, nói, Ctrl + c hoặc Program.exit().Kết nối một cách phù hợp với mongoose khi bạn đã hoàn thành

Mã này sẽ gần như thế này:

var mongoose = require('mongoose'); 

// if my program ends after this line, it shuts down as expected, my guess is that the connection is not really done here but only on the first real request ? 
mongoose.connect('mongodb://localhost:27017/somedb'); 

// define some models 

// if I include this line for example, node never stop afterwards 
var MyModel = mongoose.model('MyModel', MySchema); 

Tôi đã thử thêm các cuộc gọi đến mongoose.disconnect() nhưng không để xảy ra. Bên cạnh đó, tất cả mọi thứ hoạt động tốt (tìm kiếm, tiết kiệm, ...).

Đây là cùng một vấn đề chính xác như người này, thật đáng buồn, ông không nhận được bất kỳ câu trả lời: https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

Cảm ơn

EDIT: chấp nhận câu trả lời dưới đây vì nó là chính xác về mặt kỹ thuật, nhưng nếu ai đã từng nhấn này vấn đề một lần nữa, có vẻ như mongoose và/hoặc trình điều khiển mongodb không thực sự đóng kết nối khi bạn yêu cầu nó nếu vẫn còn các truy vấn đang chạy.

Nó thậm chí không nhớ cuộc gọi ngắt kết nối ở tất cả, nó không làm điều đó một khi các truy vấn được kết thúc chạy; nó chỉ loại bỏ cuộc gọi của bạn mà không có ngoại lệ hoặc bất kỳ điều gì sắp xếp, và không bao giờ thực sự đóng kết nối.

Vì vậy, bạn có nó: đảm bảo rằng mọi truy vấn đã được xử lý trước khi gọi ngắt kết nối() nếu bạn muốn nó thực sự hoạt động.

+0

Có cách nào để thực hiện việc này chỉ từ việc nhập mô hình không? cả hai câu trả lời dưới đây đều không hoạt động: \ – Antoine

Trả lời

128

Bạn có thể đóng kết nối với

mongoose.connection.close() 
+14

Điều này thực tế đóng kết nối. Tuy nhiên, cuộc gọi này đã xóa nội dung trong cơ sở dữ liệu của tôi. Khi tôi chuyển sang mongoose.disconnect() mọi thứ hoạt động đúng và các kiểm tra mocha của tôi bắt đầu hoạt động bình thường trở lại –

+1

Điều này có hiệu quả đối với tôi. Tôi chỉ cần đảm bảo rằng tôi đã đặt điều này trong cuộc gọi lại chính xác hoặc nếu không có thể nó đã đóng kết nối trước khi lưu vào cơ sở dữ liệu đã có cơ hội hoàn thành. Để công bằng, tôi vẫn đang sử dụng một tập lệnh đơn giản chỉ kết nối với db cục bộ và lưu đối tượng ví dụ đơn giản của người dùng. Trong callback đến user.save() là nơi tôi gọi mongoose.connection.close(). – FateNuller

+0

Như bạn có thể thấy, những câu trả lời này là cũ. Nếu bạn đang sử dụng _Mongoose 5.0.4_, [phương thức 'Connection.close()'] (http://mongoosejs.com/docs/api.html#connection_Connection-close) chỉ được xuất, chỉ có sẵn, vì vậy hãy sử dụng nó . –

40

Câu trả lời khác không làm việc cho tôi. Tôi đã phải sử dụng mongoose.disconnect(); như đã nêu trong this answer.

+0

Điều này cũng được ưu tiên khi rách môi trường thử nghiệm. –

+0

mongoose.disconnect() là tốt hơn để sử dụng và một cách tiếp cận hợp lý. –

8

Bạn có thể thiết lập các kết nối đến một biến sau đó ngắt kết nối nó khi bạn đang thực hiện:

var db = mongoose.connect('mongodb://localhost:27017/somedb'); 

// Do some stuff 

db.disconnect(); 
+0

Trong tình huống của tôi (thử nghiệm Mongoose bên trong Jest) đây là giải pháp duy nhất làm việc –

+0

Tôi làm Model.update (..) với Mongoose trong vòng for-loop.Có cần phải đóng kết nối sau mỗi lần cập nhật không? Máy chủ của tôi phải xử lý nhiều cập nhật và ngừng hoạt động sau một thời gian. – Pille

+0

Câu trả lời giống như dưới đây – DanFromGermany

1

Tôi đang sử dụng phiên bản 4.4.2 và không có câu trả lời khác làm việc cho tôi. Nhưng thêm useMongoClient vào các tùy chọn và đặt nó vào một biến mà bạn gọi close có vẻ như hoạt động.

var db = mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: true }) 

//do stuff 

db.close() 
Các vấn đề liên quan