我一直在通过Express发现Node(而不是我曾经使用的Meteor)。而且我被一种异步的东西逼走了..
在函数下面(读取mongo集合)
function isAuthorized(x) {
// Connect to database when Bq. receives a message
mongoClient.connect(process.env.MONGO, function (err, db) {
if (err) {
console.log('Unable to connect to the mongoDB server')
} else {
console.log('Connection established')
let Users = db.collection('users')
Users.find( {_id: From} ).toArray(function (err, result) {
if (err) { console.log(err) }
else if (result.length) {
console.log("found");
// switch (true) {
// case x == null && result.authorization == null : return true
// break ;
// case x == false && result.authorization == false : return true
// break ;
// case x == true && result.authorization == true : return true
// break ;
// default: return false
//} // end of switch()
}
else {
console.log("does not exist");
if (x == 'unknown user') { console.log("return true"); return true }
}
db.close()
})
}
})
} // end of isAuthorized()
此函数被调用为开关()。
switch (true) {
case isAuthorized('unknown user') : something
case XYZ
case ABC
Default: console.log("default")
}
问题是: switch()在isAuthorized()函数结束之前触发。因此,switch()触发默认情况(而不是isAuthorized('unknown user')== true)。该函数似乎不等待数据库被读取......
如何使switch()等待函数的最终结束isAuthorized()?
我听说过回调 - 想想,异步,但我无法按照明确的顺序对所有这些事情进行排序..任何简单的想法/帮助?
非常感谢。
答案 0 :(得分:1)
您的代码目前的结构方式,这是不可能的。
见async
& await
正如您已经说过的,您需要使用回调。在您的示例中,您必须先检查用户是否先获得授权,然后再运行switch语句。
伪代码:
function isAuthorized(user, callback) {
// Run your mongoDB logic
mongoClient.connect(process.env.MONGO, function (err, db) {
Users.find({ _id: From }).toArray(function (err, result) {
var authorized = ...check if user is authorized...
db.close();
callback(authorized);
});
});
}
然后像这样使用它:
isAuthorized(yourUser, function (authorized) {
if (authorized) {
// business logic
}
});
我希望这能为你解决一些问题。