index.js 文件:
var express = require('express');
var router = express.Router();
function validCheck (exp,name) {
return exp.test(name);
}
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index');
});
var user=db.collection('user'); //gives reference error,db is not defined
router.post('/',function(req,res,next){
username=req.body.username;
password=req.body.password;
//var user=db.collection('user'); //works fine
user.findOne({'username':username,'password':password},function(err,docs){
//do something
});
});
module.exports = router;
在 var user=db.collection('user')
外部 router.post
使用时,会出现错误,但是当在 router.post
内部使用相同时,它工作正常。
我在这里缺少的概念可能是什么?
编辑:涉及 mongodb 的 App.js 文件的一部分
var mongodb= require('mongodb');
var MongoClient= mongodb.MongoClient;
var URL = 'mongodb://127.0.0.1:27017/mainDB';
MongoClient.connect(URL,function(err,database){
if(!err){
db=database;
}
else{
//do something
}
});
原文由 R-R 发布,翻译遵循 CC BY-SA 4.0 许可协议
请记住
MongoClient.connect()
是异步的。在您执行var user=db.collection('user');
时,数据库连接可能尚未准备就绪。数据库连接已经在回调完成后建立,不会早于此。当第一个请求完成时,数据库连接恰好建立。您等待的时间越长,它越有可能奏效,但这仍然是错误的方法。
使用全局变量也是不好的做法,会导致混乱和 其他问题。
简而言之,代码应该是这样的
比像使用它
请注意,连接是在第一个要求时建立的,因此如果您在 App.js 中添加
require('database.js');
。您不会在第一次请求时松开。或者,您可以使用 promises ,它会为您处理等待逻辑。