Đóng đúng kết nối của cầy mangut sau khi bạn hoàn thành


145

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

Mã trông gần giống 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 vào mongoose.disconnect () nhưng không có kết quả. Bên cạnh đó, mọi thứ đều hoạt động tốt (tìm kiếm, tiết kiệm, ...).

Đây là vấn đề chính xác giống như người này, thật đáng buồn khi anh ta không nhận được bất kỳ câu trả lời nào: 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ó đúng về mặt kỹ thuật, nhưng nếu bất cứ ai gặp phải vấn đề này một lần nữa, có vẻ như trình điều khiển mongoose và / hoặc trình điều khiển mongodb không thực sự đóng kết nối khi bạn hỏi nó nếu vẫn còn truy vấn.

Nó thậm chí không nhớ cuộc gọi ngắt kết nối, nó không thực hiện khi truy vấn kết thúc; nó chỉ loại bỏ cuộc gọi của bạn mà không có ngoại lệ bị ném hoặc bất cứ thứ gì tương tự, 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 disconnect () nếu bạn muốn nó thực sự hoạt động.


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

Câu trả lời:


201

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

mongoose.connection.close()

25
Điều này trong 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 bình thường và các bài kiểm tra mocha của tôi bắt đầu hoạt động bình thường trở lại
Brian Noah

1
Điều này làm việc cho tôi. Tôi chỉ cần đảm bảo rằng tôi đã đặt nó trong cuộc gọi lại chính xác nếu không nó có thể đã đóng kết nối trước khi lưu vào cơ sở dữ liệu có cơ hội kết thúc. Để 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 một đối tượng người dùng ví dụ đơn giản. Trong hàm gọi lại cho user.save () là nơi tôi gọi mongoose.connection.close ().
FateNuller

6
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 , các Connection.close()phương pháp này chỉ xuất khẩu, chỉ có sẵn, do đó sử dụng nó.
Toàn cảnh

74

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 câu trả lời này .


Điều này cũng được ưa thích khi phá bỏ một môi trường thử nghiệm.
Matt Lo

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

16

Bạn có thể đặt kết nối thành một biến sau đó ngắt kết nối khi bạn hoàn thành:

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

// Do some stuff

db.disconnect();

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 có hiệu quả
Code Whisperer

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

Câu trả lời tương tự như dưới đây
Daniel W.

3

Tôi đang sử dụng phiên bản 4.4.2 và không có câu trả lời nào khác phù hợp với tôi. Nhưng việc thêm useMongoClientvào các tùy chọn và đưa nó vào một biến mà bạn gọi closedường như hoạt động.

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

//do stuff

db.close()

1

Bạn sẽ gặp lỗi nếu bạn cố gắng đóng / ngắt kết nối bên ngoài phương thức. Giải pháp tốt nhất là đóng kết nối trong cả hai cuộc gọi lại trong phương thức. Mã giả ở đây.

const newTodo = new Todo({text:'cook dinner'});

newTodo.save().then((docs) => {
  console.log('todo saved',docs);
  mongoose.connection.close();
},(e) => {
  console.log('unable to save');
});

1

Giống như Jake Wilson đã nói: Bạn có thể đặt kết nối thành một biến sau đó ngắt kết nối nó khi bạn hoàn thành:

let db;
mongoose.connect('mongodb://localhost:27017/somedb').then((dbConnection)=>{
    db = dbConnection;
    afterwards();
});


function afterwards(){

    //do stuff

    db.disconnect();
}

hoặc nếu bên trong chức năng Async:

(async ()=>{
    const db = await mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: 
                  true })

    //do stuff

    db.disconnect()
})

mặt khác khi tôi kiểm tra nó trong môi trường của tôi thì nó có lỗi.


0

Có lẽ bạn có điều này:

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

// Do some stuff

db.disconnect();

nhưng bạn cũng có thể có một cái gì đó như thế này:

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

const model = mongoose.model('Model', ModelSchema);

model.find().then(doc => {
  console.log(doc);
}

bạn không thể gọi db.disconnect()nhưng bạn có thể đóng kết nối sau khi sử dụng.

model.find().then(doc => {
  console.log(doc);
}).then(() => {
  mongoose.connection.close();
});
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.