将Async函数传递给Node.js Express.js路由器

For*_*low 7 javascript node.js express async-await

这似乎是一个简单的谷歌,但我似乎无法找到答案......

你能将ES7异步功能传递给Express路由器吗?

例:

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

app.get('/', async function(req, res){
  // some await stuff
  res.send('hello world');
});
Run Code Online (Sandbox Code Playgroud)

如果没有,你能指出我如何处理这个问题的正确方向ES7风格?或者我只需要使用承诺?

谢谢!

小智 11

可能是你没有找到结果因为async/awaitES7而不是ES6功能,它在节点> = 7.6中可用.

您的代码将在节点中工作.我测试了以下代码

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"))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

基本上,你得到它,你必须有async一个函数,以便await在其代码中的承诺.这在节点LTS v6中不受支持,因此可能使用babel来转换代码.希望这可以帮助.

  • **警告:** 如果直接使用*异步函数*,express 将停止处理错误,并且不会以 **500** 状态代码进行响应。事实上,如果发生错误,express根本不会响应,客户端会一直等待,直到超时。 (6认同)
  • 这是针对 v5 的修复,来自文档,“从 Express 5 开始,返回 Promise 的路由处理程序和中间件将在拒绝或抛出错误时自动调用 next(value)。” (3认同)
  • @MichaelBushe 一切都是答案,它可以帮助您理解问题 (2认同)

Mad*_*col 7

更新

从 ExpressJs 5 开始,支持异步函数,并按预期抛出错误

从 Express 5 开始,返回 Promise 的路由处理程序和中间件将在拒绝或抛出错误时自动调用 next(value)


在 Express 4 或更低版本中,它有点工作,但不是真的

虽然它似乎可以工作,但它停止处理异步函数内部抛出的错误,因此,如果未处理错误,服务器永远不会响应,客户端会一直等待直到超时。

正确的行为应该是响应500状态代码。


解决方案

快递承诺路由器

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

// Use it like a normal router, it will handle async functions
Run Code Online (Sandbox Code Playgroud)

快速异步

const asyncify = require('express-asyncify')
Run Code Online (Sandbox Code Playgroud)

修复app对象中设置的路由

替换var app = express();

var app = asyncify(express());
Run Code Online (Sandbox Code Playgroud)

修复router对象中设置的路由

替换var router = express.Router();

var router = asyncify(express.Router());
Run Code Online (Sandbox Code Playgroud)

笔记

您只需要asyncify在您直接设置路由的对象中应用该功能

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