node.js express async-await

node.js - Express JS utiliza la función asíncrona en las solicitudes



async-await (3)

app.use(async function(req, res, next) { try { var myres = await new Promise((resolve, reject) => { mysql_connection.query("select * from Users;", (err, rows) => { if (err) { reject(err); } else { resolve(rows); } }); }); } catch (error) { console.log(error); } });

La pregunta es. ¿Está bien usar la función asíncrona para poder usar a la espera de consultas de base de datos? Me temo que puede causar algunos problemas en el lado de ExpressJs.


Async await se puede utilizar sin problemas para consultas de base de datos. Podría usar try catch catch; sin embargo, existe una solución más elegante que le permite usar el middleware de manejo de errores que ofrece Express:

Envuelves tu middleware con esta función:

const asyncMiddleware = fn => (req, res, next) => { Promise.resolve(fn(req, res, next)) .catch(next); };

Entonces puedes usarlo de la siguiente manera:

const asyncMiddleware = require(''./utils/asyncMiddleware''); router.get(''/'', asyncMiddleware(async (req, res, next) => { /* if there is an error thrown in getUserFromDb, asyncMiddleware will pass it to next() and express will handle the error; */ const user = await getUserFromDb({ id: req.params.id }) res.json(user); }));

Si se produce un error, el control se entregará al middleware de manejo de errores, que es un software intermedio que tiene cuatro argumentos como este:

app.use(function (err, req, res, next) { // your error code })


El uso de la función asíncrona para poder usar a la espera de consultas de base de datos está totalmente bien. Pero intente incrustar ese código en el bloque try and catch para poder detectar las excepciones.


async..await es azúcar sintáctica para promesas, y una promesa es solo un patrón que se basa en devoluciones de llamada. El uso de funciones async es aceptable siempre que el entorno las admita. async..await es compatible desde Node.js 7.6.0.

async función async siempre devuelve una promesa. Siempre que este valor de retorno implícito no cause problemas, está perfectamente bien en todas partes, incluido Express. No importa si se utiliza para consultas de base de datos o cualquier otra cosa.

A menos que la API admita promesas, los errores deben manejarse por completo en una función async . El cuerpo de la función se debe envolver con try..catch para descartar rechazos no try..catch que puede dar lugar a excepciones en futuras versiones de Node.

El código original no contiene las next llamadas y simplemente suprime un error. Como regla general, el middleware async debería estar estructurado así:

app.use(async function(req, res, next) { try { ... next(); } catch (error) { next(error); } });