Saltar al contenido

Pasar funciones asíncronas al enrutador Node.js Express.js

Si encuentras algún fallo en tu código o proyecto, recuerda probar siempre en un entorno de testing antes subir el código al trabajo final.

Solución:

Puede ser que no encontraste resultados porque async/await es un ES7 no es una característica de ES6, está disponible en el nodo >= 7.6.

Su código funcionará en node. He probado el siguiente código

var express = require('express');
var app = express();

async function wait (ms) 
  return new Promise((resolve, reject) => 
    setTimeout(resolve, ms)
  );


app.get('/', async function(req, res)
  console.log('before wait', new Date());
  await wait(5 * 1000);
  console.log('after wait', new Date())
  res.send('hello world');
);

app.listen(3000, err => console.log(err ? "Error listening" : "Listening"))

Y voilá

MacJamal:messialltimegoals dev$ node test.js 
Listening undefined
before wait 2017-06-28T22:32:34.829Z
after wait 2017-06-28T22:32:39.852Z
^C

Básicamente lo tienes, tienes que async una función para await en una promesa dentro de su código. Esto no es compatible con el nodo LTS v6, por lo que se puede usar babel para transpilar el código. Espero que esto ayude.

Creo que no puede hacerlo directamente porque las excepciones no se detectan y la función no regresará si se lanza una. Este artículo explica cómo crear una función contenedora para que funcione: http://thecodebarbarian.com/using-async-await-with-mocha-express-and-mongoose.html

No lo he probado, pero estuve investigando esto recientemente.

De alguna manera funciona, pero no realmente

Si bien parece funcionar, deja de manejar los errores generados dentro de la función asíncrona y, como resultado, si no se maneja un error, el servidor nunca responde y el cliente sigue esperando hasta que se agota el tiempo de espera.

El comportamiento correcto debe ser responder con un 500 código de estado.


Soluciones

express-promise-router

const router = require('express-promise-router')();

// Use it like a normal router, it will handle async functions

express-asyncify

const asyncify = require('express-asyncify')

Para fijar rutas establecidas en el app objeto

Reemplazar var app = express(); con

var app = asyncify(express());

Para arreglar rutas establecidas en router objetos

Reemplazar var router = express.Router(); con

var router = asyncify(express.Router());

Nota

Solo tienes que aplicar el asyncify función en los objetos donde establece las rutas directamente

https://www.npmjs.com/package/express-asyncify

Si haces scroll puedes encontrar los comentarios de otros desarrolladores, tú además puedes mostrar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *