为什么我需要在node-postgres

时间:2018-09-22 01:49:06

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

我写了这段似乎可行的代码:

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/awaitauth_facade::findPersonByEmail上都需要auth_controller::signin

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

2 个答案:

答案 0 :(得分:4)

您当前的代码:

一家人去购物中心。 (0)爸爸很累,说:“继续购物,我等着我们一起回家。” (1)后来的一个女儿说:“我不想去那家商店,我会在这里闲逛,等着你,然后我们再回爸爸。” (2)妈妈完成购物并返回女儿,(3)他们俩都回来接爸爸,一起回家。

您的代码没有外部await

一家人去购物中心。 (0)爸爸累了,说:“继续购物,我会在这里。” (1)后来的一个女儿说:“我不想去那家商店,我会在这里闲逛,等着你,然后我们再回爸爸。”但是,大约在同一时间,(3)爸爸转身并决定回家,因为等待是在等待失败者。 (2)妈妈完成购物并返回女儿,他们俩都回来发现爸爸开车不见了,他们拿着一堆购物袋被困在商场里。

女儿和爸爸都需要等待,以免他们离开别人。

答案 1 :(得分:0)

awaitAuthFacade这两个地方需要AuthController的原因是,因为您要处理的是两个不同的承诺:

  1. 一个 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