Tôi có một rất đơn giản "server.js" thiết lập mà tôi đang cố gắng để chạy:Cách thích hợp để xử lý các kết nối mongoose với express.js là gì?
var express = require('express'),
wines = require('./routes/testscripts');
var app = express();
app.get('/first_test', wines.popSingleData);
app.listen(3000);
console.log('Listening on port 3000...');
này được thiết lập để kết nối với localhost:3000
Khi tôi hướng đến localhost:3000/first_test
, nó gọi là "popSingleData "phương pháp trong testscript.js:
...
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;
console.log('include called');
exports.popSingleData = function(req, res) {
// var mongoose = require('mongoose');
// mongoose.connect('mongodb://localhost/test');
// var db = mongoose.connection;
console.log('function called');
db.on('error', console.error.bind(console, 'connection error:'));
console.log('error handler set');
db.once('open', function callback() {
//yay!
console.log("DB Opened");
var someSchema = require('../models/someSchema');
someSchema.find(function (err, found){
if (err)
{
console.log('err');
}
if(found.length != 0)
{
console.log("Found Data:");
console.log(found);
for(var i = 0; i < found.length; i++)
{
res.jsonp((found[i]));
}
}
});
});
};
...
các dòng đang gây ra vấn đề là người đầu tiên 3:
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;
Khi chúng được khai báo bên trong hàm, tập lệnh chạy như mong đợi, in ra các đối tượng JSON mà nó tìm thấy từ cơ sở dữ liệu. Khi chúng được xác định trong testscript.js, nhưng nằm ngoài phạm vi của phương thức, chương trình bị treo trên db.once('open', function callback() {...}); command
.
Ai đó có thể làm sáng tỏ sự khác biệt xảy ra khi di chuyển 3 dòng mã này? Tôi có thực sự cần phải tạo kết nối mới mỗi lần tôi muốn có một chức năng khác để truy cập cơ sở dữ liệu không?
Vì vậy, 'mongoose.connect' là gì tạo kết nối? Vì vậy, lý do nó không hoạt động khi bên ngoài phương pháp, là phương pháp tìm thấy nó đã được mở, do đó, db.once ("mở") không bao giờ xảy ra? –
Có, cố gắng làm rõ điều đó trong câu trả lời của tôi. – WiredPrairie
Tuyệt vời. Đã chuyển mã ra khỏi cuộc gọi lại và dường như nó hoạt động tốt. Cảm ơn rất nhiều! –