Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 等待不是暂停执行_Node.js_Async Await_Fastify - Fatal编程技术网

Node.js 等待不是暂停执行

Node.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

我不明白为什么执行会继续,而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 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接口访问他们的数据库,而不是promisify
con.query()
自己。@jfriend00啊,我的错
mysql
不支持开箱即用的承诺,但
mysql2
支持。取决于使用的是哪一个OP。是的,
mysql2
是正确的选择。mysql2 FTW。谢谢现在所有的数据库都提供了承诺接口。OP应该使用promisify接口访问他们的数据库,而不是promisify
con.query()
自己。@jfriend00啊,我的错
mysql
不支持开箱即用的承诺,但
mysql2
支持。取决于使用的是哪一个OP。是的,
mysql2
是正确的选择。mysql2 FTW。谢谢