Javascript 跳过Node.js行,然后进行处理

Javascript 跳过Node.js行,然后进行处理,javascript,mysql,node.js,debugging,Javascript,Mysql,Node.js,Debugging,在调试代码时,我注意到第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 re

在调试代码时,我注意到第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 })
下面的代码在第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;
    });
}

有人能解释一下原因并提供解决方案吗?

这个.db.query是一个异步函数,您应该等待它完成

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

您可以使用此

与其他行不同,第4行执行一个数据库查询,该查询异步工作并遵循。延迟响应直到数据库查询完成的一种方法是使
execute
函数也遵循回调模式:

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();
  });
}
通过这种方式,您可以将数据库查询结果作为参数传递给回调,并在该回调中返回对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))
    });
})

请看这里:
.send()
.end()
不需要同时使用。请阅读并研究以下内容:。您的
execute()
函数从不返回任何内容。从异步回调内部返回只返回回调,而不返回调用函数。而且,在调用回调函数时,调用函数已经返回(例如,在调用函数已经返回之后调用回调函数)。这似乎不太可能是正确的。我不知道有哪种DB接口既返回承诺(可以与
wait
一起使用)又接受回调。这将是一个或另一个,而不是两个。OP应该获得支持承诺的数据库的正确接口,然后只使用承诺进行编程。然后,他们可以直接返回承诺,调用方可以使用
wait