记住MongoClient.connect()
是异步的。您此时数据库连接可能尚未准备好var user=db.collection('user');
。数据库连接已在回调完成时建立,不早于此。
当第一个请求完成时,数据库连接恰好建立。等待的时间越长,这种方法就越有可能有效,但这仍然是错误的方法。
使用全局变量也是不好的做法,会导致混乱和其他问题.
简而言之,代码应该如下所示
// module database.js
var mongodb= require('mongodb');
var MongoClient= mongodb.MongoClient;
var URL = 'mongodb://127.0.0.1:27017/mainDB';
var db;
var error;
var waiting = []; // Callbacks waiting for the connection to be made
MongoClient.connect(URL,function(err,database){
error = err;
db = database;
waiting.forEach(function(callback) {
callback(err, database);
});
});
module.exports = function(callback) {
if (db || error) {
callback(error, db);
} else {
waiting.push(callback);
}
}
}
比使用它像
var db = require('database.js');
router.post('/',function(req,res,next){
username=req.body.username;
password=req.body.password;
db.conn(function(err, database) {
if (err) {
res.sendStatus(500);
console.log(err);
return;
}
database.collection('users').findOne({'username':username, 'password':password}, function(err, docs){
//do something
});
});
});
请注意,连接是在第一个 require 时建立的,因此如果您添加require('database.js');
在 App.js 中。您不会在第一个请求时丢失。
或者你可以使用promises,它会为您处理等待逻辑。