我写了这段似乎可行的代码:
database.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。
但是,我不明白为什么在async/await
和auth_facade::findPersonByEmail
上都需要auth_controller::signin
?
为什么,如果我从auth_controller::signin
签名及其内部的await
中删除了异步,我不再得到0123了,而是得到了0132?是否应该在auth_facade
中等待它被阻止?
答案 0 :(得分:4)
您当前的代码:
一家人去购物中心。 (0)爸爸很累,说:“继续购物,我等着我们一起回家。” (1)后来的一个女儿说:“我不想去那家商店,我会在这里闲逛,等着你,然后我们再回爸爸。” (2)妈妈完成购物并返回女儿,(3)他们俩都回来接爸爸,一起回家。
您的代码没有外部await
:
一家人去购物中心。 (0)爸爸累了,说:“继续购物,我会在这里。” (1)后来的一个女儿说:“我不想去那家商店,我会在这里闲逛,等着你,然后我们再回爸爸。”但是,大约在同一时间,(3)爸爸转身并决定回家,因为等待是在等待失败者。 (2)妈妈完成购物并返回女儿,他们俩都回来发现爸爸开车不见了,他们拿着一堆购物袋被困在商场里。
女儿和爸爸都需要等待,以免他们离开别人。
答案 1 :(得分:0)
在await
和AuthFacade
这两个地方需要AuthController
的原因是,因为您要处理的是两个不同的承诺:
findPersonByEmail()
(来自数据库查询)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。