Điều này là do mã chứa một mẫu chống:mỗi khi có yêu cầu mới, nó sẽ mở một kết nối cơ sở dữ liệu mới, sau đó đóng kết nối đó khi phản hồi được gửi đi. Sau đó, nó đã cố gắng sử dụng lại kết nối đã đóng, do đó thông báo lỗi mà bạn thấy ở yêu cầu thứ hai.
Những gì bạn muốn là chỉ kết nối một lần với cơ sở dữ liệu trong suốt thời gian tồn tại của ứng dụng bằng cách sử dụng đối tượng kết nối toàn cục, sau đó sử dụng đối tượng toàn cục đó để thực hiện các hoạt động cơ sở dữ liệu của bạn.
Sử dụng đối tượng toàn cục này cho phép trình điều khiển MongoDB tạo đúng cách một nhóm kết nối đến cơ sở dữ liệu. Nhóm này được quản lý bởi trình điều khiển MongoDB và tránh kiểu kết nối / kết nối lại tốn kém.
Ví dụ:
// listen on this port
const port = 3000
// global database client object
var client = null
// listen on the configured port once database connection is established
MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true }, (err, res) => {
assert.equal(null, err)
client = res
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
})
// use the client global object for database operations
app.get('/', (req, res) => {
db = req.query.db
col = req.query.col
client.db(db).collection(col).find({}).toArray((err, docs) => {
assert.equal(null, err)
res.send(JSON.stringify(docs))
})
})
Chỉnh sửa để trả lời câu hỏi của bạn trong bình luận:
Điều này là do trong mã gốc, dbClient
đã được xác định trên toàn cầu. Khi dbClient.close()
đã được gọi, dbClient
toàn cầu đã đóng cửa. Sau đó, một lỗi đã được tạo ra khi dbClient
đó đối tượng đã được sử dụng lại. Điều này là do connect()
tạo một nhóm kết nối thay vì một kết nối duy nhất và không được gọi là nhiều lần cho mỗi lần gọi.
Nếu bạn di chuyển dbClient
biến từ phạm vi toàn cầu thành app.get()
ngữ cảnh, bạn sẽ thấy rằng không có lỗi nào được tạo ra khi bạn gọi điểm cuối HTTP nhiều lần, dưới dạng một dbClient
mới đối tượng được tạo mọi lúc.
Phải nói rằng, mặc dù nó sẽ hoạt động, nhưng đây không phải là một mô hình được khuyến khích. Tốt hơn là sử dụng một mẫu tương tự như mã ví dụ mà tôi đã đăng ở trên.