【问题标题】:Why do I need to use async/await twice in node-postgres为什么我需要在 node-postgres 中使用 async/await 两次
【发布时间】:2019-02-26 09:35:08
【问题描述】:

我编写的这段代码似乎可以正常工作:

数据库.js

const {Pool} = require('pg');

const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});

module.exports = {
query: (text, params) => pool.query(text, params)
};

auth_facade.js

const database = require('../../utils/database');

module.exports.findPersonByEmail = async function(email) {
const query = 'SELECT * FROM Person WHERE email = $1';
const values = [email];

try {
    console.log(1);
    const {rows} = await database.query(query, values);
    console.log(2);
    return rows[0];
} catch (err) {
    next(err);
}
};

auth_controller.js

const authFacade = require('./auth_facade');

module.exports.signin = async function(req, res, next) {
console.log(0);
var person = await authFacade.findPersonByEmail(req.body.email);
console.log(3);
};

正如我所料,它显示的是 0123。

但是,我不明白为什么我在 auth_facade::findPersonByEmail 和 auth_controller::signin 上都需要 async/await?

为什么,如果我从 auth_controller::signin 签名和其中的 await 中删除异步,我不再得到 0123,而是 0132? auth_facade中的等待不应该被阻止吗?

【问题讨论】:

  • 你的signin函数中不需要async/await,如果它只是调用authFacade.findPersonByEmail;否则,您“需要”它,因为底层 pool.query 返回一个承诺(所以它是 async)。 authFacade.findPersonByEmail 是 async,所以它没有阻塞。

标签: javascript node.js async-await es6-promise node-postgres


【解决方案1】:

您当前的代码:

一家人去商场。 (0) 爸爸累了说:“去买东西吧,我等着我们一起回家。” (1) 过了一会儿,女儿说:“我不想去那家店,我就在这里闲逛,等你,然后我们会回到爸爸身边。” (2) 妈妈买完东西回到女儿身边, (3) 两人回来接爸爸一起回家。

您的代码没有外部await:

一家人去商场。 (0) 爸爸累了,说“去买东西吧,我来。” (1) 过了一会儿,女儿说:“我不想去那家店,我就在这里闲逛,等你,然后我们会回到爸爸身边。”然而,大约在同一时间,(3)爸爸转身决定回家,因为等待是失败者。 (2) 妈妈买完东西回到女儿身边,回来发现爸爸开着车走了,提着一堆购物袋被困在商场里。

女儿和爸爸都需要等待,以免他们留下任何人。

【讨论】:

  • 很好的解释。我的下一个问题是“有没有办法让我避免只有一个等待/异步?”我心中唯一的异步任务应该是数据库查询。也就是说,我能不能强迫爸爸跟着女儿,和她一起在店门口等妈妈?
  • 其实可以的。带上爸爸就相当于@woozyking 说的:signin 不需要异步。
【解决方案2】:

之所以在两个地方需要await,AuthFacade 和AuthController,是因为您要处理两个不同的 Promise:

  1. 一个in findPersonByEmail()(来自数据库查询)
  2. 一个来自 findPersonByEmail()。

显示:

findPersonByEmail(email: string): Promise<Person>;

//same difference
let person = await authFacade.findPersonByEmail(req.body.email);

//same difference
authFacade.findPersonByEmail(req.body.email).then(person => {
});

如果您想了解更多信息,请阅读:Up and Running with Asynchronous JavaScript。

【讨论】:

    猜你喜欢
    • 2020-01-31
    • 2017-10-26
    • 1970-01-01
    • 2019-04-13
    • 2019-05-23
    • 2015-06-30
    • 2012-08-27
    • 1970-01-01
    相关资源
    最近更新 更多