Node.js 等待不是暂停执行
我不明白为什么执行会继续,而wait不是暂停执行,直到调用的函数返回 在node.js应用程序中 Contacts.jsNode.js 等待不是暂停执行,node.js,async-await,fastify,Node.js,Async Await,Fastify,我不明白为什么执行会继续,而wait不是暂停执行,直到调用的函数返回 在node.js应用程序中 Contacts.js async function routes (fastify, options) { fastify.get('/contact', async (req, reply) => { let lookup = require('../helpers/validate_school'); let school_info = await
async function routes (fastify, options) {
fastify.get('/contact', async (req, reply) => {
let lookup = require('../helpers/validate_school');
let school_info = await lookup.validate(req.hostname.split('.')[0]);
console.log('here: ', school_info);
let school = school_info.school;
...
reply.view('application/application.html', school);
});
};
school.lookup.js
async function validate(hostname){
const con = require('../../config/db').getDb();
let ret = {};
console.log('lets check for school info');
await con.query('SELECT * FROM schools where identifier=? LIMIT ?', [hostname, 1], function(err, res, fields){
if (err) throw err;
if (res.length > 0){
ret.school = JSON.stringify(res[0]);
...
console.log('found: ', ret);
return ret;
} else {
console.log('not found: ', ret);
return ret;
}
});
};
module.exports = {validate: validate};
日志
如何确保lookup.validate在代码块中继续之前返回?等待的整个要点是,您不必使用回调。相反,它只会将数据返回给您或在拒绝时抛出错误。您需要选择一个,或者只使用回调,或者只使用异步/等待 也就是说,async/await只在承诺上起作用。但是
mysql
库不使用承诺。因此,在这种情况下,如果您使用的是mysql
,而不是mysql2
,那么您甚至不能使用async/wait
另外,回调不会返回任何内容。Return语句在异步场景中不起作用
你有两个选择。处理回调的异步性并直接使用该值:
con.query('SELECT * FROM schools where identifier=? LIMIT ?', [hostname, 1], function(err, res, fields){
// The result cannot leave this callback.
// Anything you need to do with the result must be done here.
});
或者,如果您使用的是mysql2
,您可以使用这样的承诺:
const data = await con.promise().query('your query');
wait
的整个要点是,您不必使用回调。相反,它只会将数据返回给您或在拒绝时抛出错误。您需要选择一个,或者只使用回调,或者只使用异步/等待
也就是说,async/await只在承诺上起作用。但是mysql
库不使用承诺。因此,在这种情况下,如果您使用的是mysql
,而不是mysql2
,那么您甚至不能使用async/wait
另外,回调不会返回任何内容。Return语句在异步场景中不起作用
你有两个选择。处理回调的异步性并直接使用该值:
con.query('SELECT * FROM schools where identifier=? LIMIT ?', [hostname, 1], function(err, res, fields){
// The result cannot leave this callback.
// Anything you need to do with the result must be done here.
});
或者,如果您使用的是mysql2
,您可以使用这样的承诺:
const data = await con.promise().query('your query');
您从未在
验证中使用返回
,因此您总是会得到未定义的
。另外,您确定con.query
返回承诺吗?不要混合使用普通回调、异步
函数声明和承诺。流量控制是一场灾难。承诺所有异步操作,然后只使用承诺进行流控制。此外,await con.query()
没有任何用处,因为它不会返回承诺,因为您使用的是回调接口,而不是承诺接口<代码>等待
除了等待承诺外,没有任何有用的功能。这需要彻底的重新设计,而不是简单的修复。基本上,不要在async
函数中使用普通的异步回调。您的async
函数无法正常工作,因为它返回的承诺不会链接到您的异步操作,因此调用方无法知道这些操作何时完成。我建议您先转到具有内置承诺接口的mysql2
。仅对所有与数据库相关的调用使用promise接口。然后,您可以在任何数据库调用中使用wait
,一切都会简单得多。您在validate
中从不使用return
,因此您总是会得到undefined
。此外,您确定con.query
返回承诺吗?不要混合使用普通回调,async
函数声明和承诺。流量控制是一场灾难。承诺所有异步操作,然后只使用承诺进行流控制。此外,await con.query()
没有任何用处,因为它不会返回承诺,因为您使用的是回调接口,而不是承诺接口<代码>等待
除了等待承诺外,没有任何有用的功能。这需要彻底的重新设计,而不是简单的修复。基本上,不要在async
函数中使用普通的异步回调。您的async
函数无法正常工作,因为它返回的承诺不会链接到您的异步操作,因此调用方无法知道这些操作何时完成。我建议您先转到具有内置承诺接口的mysql2
。仅对所有与数据库相关的调用使用promise接口。然后,您可以在任何数据库调用中使用wait
,一切都会简单得多。OP应该使用promisify接口访问他们的数据库,而不是promisifycon.query()
自己。@jfriend00啊,我的错mysql
不支持开箱即用的承诺,但mysql2
支持。取决于使用的是哪一个OP。是的,mysql2
是正确的选择。mysql2 FTW。谢谢现在所有的数据库都提供了承诺接口。OP应该使用promisify接口访问他们的数据库,而不是promisifycon.query()
自己。@jfriend00啊,我的错mysql
不支持开箱即用的承诺,但mysql2
支持。取决于使用的是哪一个OP。是的,mysql2
是正确的选择。mysql2 FTW。谢谢