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. usar la función asíncrona para poder usar la espera para consultas de base de datos está bien? Me temo que puede causar algunos problemas en el lado de expressjs.
async..await es azúcar sintáctico 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.
La 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 usa para consultas de bases de datos o cualquier otra cosa.
A menos que la API admita promesas, los errores deben manejarse por completo en la función async . El cuerpo de la función debe envolverse con try..catch para descartar rechazos no controlados que pueden generar excepciones en futuras versiones de Node.
El código original no contiene next llamadas y solo suprime un error. Como regla general, el middleware async debe estructurarse así:
app.use(async function(req, res, next) { try { ... next(); } catch (error) { next(error); } });Async await se puede usar sin problemas para consultas de bases de datos. Puede usar Try Catch, sin embargo, hay 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 middlware que tiene cuatro argumentos como este:
app.use(function (err, req, res, next) { // your error code })También puede importar en su server.ts o server.js el https://www.npmjs.com/package/express-async-errors que maneja errores asíncronos en express
yarn add express-async-errors E impórtelo import 'express-async-errors'; en su archivo principal.