Javascript 跳过Node.js行,然后进行处理
在调试代码时,我注意到第4行被跳过,然后在第5行和第6行之后进行处理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
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
。