简体   繁体   English

Node.js 行跳过然后处理

[英]Node.js line skipped and then processed

While debugging the code I noticed that the line 4 is getting skipped and then processed after line 5 & 6.在调试代码时,我注意到第 4 行被跳过,然后在第 5 行和第 6 行之后处理。

1 router.post(routes.availability, function (req, res) {
2    const sqlClient = require('../framework/db/mysql');
3    var query = "Select 1 as 'data' from dual;";
4    var result = sqlClient.execute(query);
5    res.send(toString(result));
6    res.end();
7 })

The below gets executed at line 4.下面在第 4 行执行。

execute(sql) {
    this.db.query(sql, function (err, results) {
        if (err) {
            logger.log("error", err);
            return null;
        }

        if (results.length)
            return results;
        return null;
    });
}

Can someone please explain why and provide a solution?有人可以解释原因并提供解决方案吗?

this.db.query is a async function, you should await until it completed this.db.query是异步 function,您应该等待它完成

1 router.post(routes.availability, async function (req, res) {
2    const sqlClient = require('../framework/db/mysql');
3    var query = "Select 1 as 'data' from dual;";
4    var result = await sqlClient.execute(query);
5    res.send(toString(result));
6    res.end();
7 })


async function execute(sql) {
    return await this.db.query(sql, function (err, results) {
        if (err) {
            logger.log("error", err);
            return null;
        }

        if (results.length)
            return results;
        return null;
    });
}

You can use this你可以用这个

Unlike the other lines, line 4 executes a database query which works asynchronously and follows the callback pattern .与其他行不同,第 4 行执行一个异步工作的数据库查询,并遵循回调模式 One way to defer the response until the database query is done is to make execute function follow the callback pattern too:将响应推迟到数据库查询完成的一种方法是让execute function 也遵循回调模式:

execute(sql, callback) {
  this.db.query(sql, function (err, results) {
    if (err) {
      logger.log("error", err);
      return callback(err)
    }

    if (results.length)
      return callback(null, results);
    return callback();
  });
}

In this way you can pass the database query result as an argument to the callback and return the response to HTTP request inside that callback:通过这种方式,您可以将数据库查询结果作为参数传递给回调,并在该回调中返回对 HTTP 请求的响应:

router.post(routes.availability, function (req, res) {
    const sqlClient = require('../framework/db/mysql');
    var query = "Select 1 as 'data' from dual;";
    sqlClient.execute(query, (err, result) => {
      if (err) {
        return res.status(500).send("Error")
      }
      res.status(200).send(toString(result))
    });
})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM