只有在读取数据库后才选择(案例)(开关)

时间:2016-09-03 21:50:15

标签: javascript node.js mongodb express asynchronous

我一直在通过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()?

我听说过回调 - 想想,异步,但我无法按照明确的顺序对所有这些事情进行排序..任何简单的想法/帮助?

非常感谢。

1 个答案:

答案 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
    }
});

我希望这能为你解决一些问题。