具有Express和Mongoose的BasicAuth

我试图添加一个基本的身份validation到我的Expresspath。 要检查组合用户/传递是否正确,我读取MongoDB数据库中的集合usermodels。 这是我的代码:

server.js

var normal = express.basicAuth(normalAuth); app.get('path', normal, function(req, res){etc.}); function normalAuth(user, pass) { var mongo = require('./database/userManager'); var result = false; mongo.start(mongo.list(function(err, data) { if(err) { throw err; } else { console.log('Getting list from db...'); for(var i in data) { console.log('Getting details from db...'); if(user == data[i].name && pass == data[i].pass) { console.log('New connection : ' + user); result = true; break; } else { console.log('Failed connection : ' + user); result = false; } } console.log('OK'); } mongo.mongoose.connection.close(); })); return result; } 

userManager.js

 var mongoose = require('mongoose'); var userModel = mongoose.connection.model('usermodel', new mongoose.Schema({ name: String, pass: String, status: { type: Boolean, default: false } }), 'usermodels'); function start(callback) { mongoose.connect('mongodb://localhost/derp', function(err) { if(err) { throw err; } else { console.log('Connected to database '); } }); } function list(callback) { userModel.find(callback); } 

身份validation几乎可以工作,它连接到数据库并获取信息。 它在控制台上打印

 "New connection : /*user connected*/". 

但有一个问题:我的函数normalAuth总是返回false,所以即使我有正确的用户/密码,我不能访问页面,我有连接窗口,如果我给错了用户/密码。 我想这是因为这个函数返回结果之前,我的mongo.start(blabla)完成,但我不知道该怎么做。

感谢您的帮助。

您总会得到错误的结果,因为在Node.js中,每个IO操作都是asynchronous的

让我来解释一下 :当你调用mongo.start(...)函数时,Node.js会把它放到另一个操作队列中,因为它是IO操作。 主操作队列不能被阻塞,这就是IO操作总是asynchronous的原因。 将mongo函数放入另一个操作队列中,您的主操作队列将继续并到达代码行: return false 。 而且无论函数mongo.start(...)如何处理,它都会返回false。

解决方法是通过发送callback函数:

 function normalAuth(user, pass, callbackResult) { var mongo = require('./database/userManager'); mongo.start(mongo.list(function(err, data) { if(err) { throw err; } else { console.log('Getting list from db...'); for(var i in data) { console.log('Getting details from db...'); if(user == data[i].name && pass == data[i].pass) { console.log('New connection : ' + user); // here you send true to callback function callbackResult(true); break; } else { console.log('Failed connection : ' + user); // here you send false to callback function callbackResult(false); } } console.log('OK'); } mongo.mongoose.connection.close(); })); } 

你可以这样调用这个函数:

 normalAuth(user, pass, function(result) { if(result) console.log("Auth OK"); else console.log("Auth Failed"); } 

编辑 :在express.basicAuth函数中,它将被这样调用:

 app.use(express.basicAuth(function(user, pass, callback) { normalAuth(user, pass, function(result) { callback(null /* error */, result); } }));