¿Por qué necesito usar async / await dos veces en node-postgres?

Escribí este código que parece estar funcionando:

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); }; 

Muestra, como esperaba, 0123.

Sin embargo, no entiendo por qué necesito el async/await auth_facade::findPersonByEmail en auth_facade::findPersonByEmail y auth_controller::signin ?

¿Por qué, si quito el async de auth_controller::signin y la await dentro de él, ya no obtengo 0123, sino 0132? ¿No debería estar bloqueado de todos modos, estar a la espera en auth_facade ?

Su código actual:

Una familia va a un centro comercial. (0) Papá está cansado y dice “Adelante, compra un poco, esperaré y luego nos iremos a casa juntos”. (1) Un poco más tarde, la hija dice: “No tengo ganas de ir a esa tienda, solo me quedaré aquí, esperándote, y luego volveremos con papá”. (2) Mamá termina de comprar y regresa con su hija, (3) ambas regresan a buscar a papá y se van a casa juntas.

Tu código sin el exterior te await :

Una familia va a un centro comercial. (0) Papá está cansado y dice “Adelante, haz algunas compras, estaré aquí”. (1) Un poco más tarde, la hija dice: “No tengo ganas de ir a esa tienda, solo me quedaré aquí, esperándote, y luego volveremos con papá”. Sin embargo, casi al mismo tiempo, (3) papá se da la vuelta y decide irse a casa, porque esperar es para los perdedores. (2) Mamá termina de comprar y regresa con su hija, ambas regresan para encontrar que papá se fue con el auto y están atrapados en el centro comercial con un montón de bolsas de compras.

Tanto la hija como el papá deben esperar para que no dejen a alguien atrás.

La razón por la que necesita await en dos lugares, AuthFacade y AuthController , es porque está tratando con dos Promesas diferentes :

  1. uno en findPersonByEmail() (de la consulta de base de datos)
  2. uno de findPersonByEmail() .

Mostrado:

 findPersonByEmail(email: string): Promise; //same difference let person = await authFacade.findPersonByEmail(req.body.email); //same difference authFacade.findPersonByEmail(req.body.email).then(person => { }); 

Si desea obtener más información, lea: En funcionamiento con JavaScript asíncrono .