NodeJS和ExpressJS并行处理休息请求

时间:2016-12-14 21:16:55

标签: node.js express

我是JavaScript,NodeJS和Express的新手。我写的是简单的应用程序,它执行以下操作

  1. 用户提出请求。
  2. 服务器进行多次休息调用并呈现响应。
  3. 如何确保所有调用都已完成,我创建了一个可以发送给用户的对象?我看到有人说过async.parallel。那是唯一的出路吗?任何例子都会有所帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用promises按顺序运行代码。 这是我使用promises创建的登录功能的一个示例(缩小了一点)。

在名为LoginController的模块中,我放置了这段代码。

this.attemptLogin = function(body, res) {
    var reason = "";
    var user = null;

    loginM.findUser(body.username)
        .then(function(result) {
            if (result.status) {
                user = result.result[0];
                return this.verifyPassword(body.password, result.result[0].Password);
            } else {
                reason = {status: false, message: "Incorrect username", result: null};
                throw(reason);
            }
        })
        .then(function(result) {
            if (result.message) {
                res.send({status: true, message: "Successfully logged in", result: user});
                return;
            } else {
                reason = {status: false, message: "Incorrect password", result: null};
                throw(reason);
            }
        }).catch(function(err) {
            res.send(err);
        });
}

在名为LoginModelLoginM)的另一个模块中,我已经放置了此代码

this.findUser = function(username, email) {
    return new Promise(function (resolve, reject) {

        pool.getConnection(function (err, connection) {
            if (err) {
                reject({status: false, message: err});
            } else {
                connection.query('select Id, Name, Email, Password from Users ' +
                'where (Users.Name = ? OR Users.Email = ?) AND Removed = 0 LIMIT 1', [username, email], function (err, rows) {
                    connection.release();
                    if (!err) {
                        if(rows.length > 0) {
                            resolve({status: true, message: "Found user", result: rows});
                        }
                        else 
                            resolve({status: false, message: null})
                    } else {
                        reject({status: false, message: err});
                    }
                });
            }
        });
    });
}

verifyPassword的类似方法也会返回一个承诺。

现在,需要注意的是:

  • 每个then内的代码都是异步运行的

  • then部分按顺序执行,即在您从之前的then

    <返回某些内容之前,您不会输入下一个then / LI>
  • 返回承诺的方法resolvefindUserverifyPassword)作为result中名为.then(function(result)的变量传递