【问题标题】:NodeJS and ExpressJS parallel processing of rest requestNodeJS和ExpressJS并行处理rest请求
【发布时间】:2016-12-15 05:39:01
【问题描述】:

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

  1. 用户提出请求。
  2. 服务器进行多次休息调用并呈现响应。

如何确保所有调用都完成并创建一个可以发送给用户的对象?我看到人们说了一些关于 async.parallel 的事情。这是唯一的出路吗?任何示例都会有所帮助。

【问题讨论】:

  • 每当我这样做时,我都会使用 Promise。只是谷歌的例子,尝试一些,然后如果你有一个特定的问题回来
  • 要扩展 Aidin,请搜索 Promise.all

标签: node.js express


【解决方案1】:

您可以使用 Promise 来按顺序运行代码。 这是我使用 Promise 实现的登录功能的示例(略微缩小)。

在名为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);
        });
}

在另一个名为 LoginModel (LoginM) 的模块中,我放置了这段代码

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

  • 无论您在返回承诺的方法(findUserverifyPassword)中的 resolve 是什么,都将作为 .then(function(result) 中名为 result 的变量传递

【讨论】:

  • 太棒了,我会试试这个!
猜你喜欢
  • 2015-06-29
  • 2019-11-14
  • 2019-02-09
  • 1970-01-01
  • 2016-08-04
  • 2014-05-06
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多