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/await是ES7而不是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来转换代码.希望这可以帮助.
从 ExpressJs 5 开始,支持异步函数,并按预期抛出错误
从 Express 5 开始,返回 Promise 的路由处理程序和中间件将在拒绝或抛出错误源时自动调用 next(value)
虽然它似乎可以工作,但它停止处理异步函数内部抛出的错误,因此,如果未处理错误,服务器永远不会响应,客户端会一直等待直到超时。
正确的行为应该是响应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
| 归档时间: |
|
| 查看次数: |
7047 次 |
| 最近记录: |