Javascript 如何为我的所有Express Middleware设置默认拒绝承诺行为?
我在express中间件中使用承诺。我想使用async/await方法Javascript 如何为我的所有Express Middleware设置默认拒绝承诺行为?,javascript,node.js,express,Javascript,Node.js,Express,我在express中间件中使用承诺。我想使用async/await方法 app.get('/data1',async function(req,res) { data = await getData1(); // This line throw an error, res.send(data) }) app.get('/data2',async function(req,res) { data = await getData2(); // This line thro
app.get('/data1',async function(req,res) {
data = await getData1(); // This line throw an error,
res.send(data)
})
app.get('/data2',async function(req,res) {
data = await getData2(); // This line throw an error
res.send(data)
})
这使得浏览器永远等待。
在服务器上,我看到
(node:251960) UnhandledPromiseRejectionWarning: Unhandled promise rejection
现在,为了修复我正在做的一个中间件:
app.get('/data1',async function (req,res){
return (async function(){
data = await getData1()
})().catch(() => {
res.send("You have an error")
}
})
app.get('/data2',async function (req,res){
return (async function(){
data = await getData2()
})().catch(() => {
res.send("You have an error")
}
})
我不喜欢这种重复。如何设置默认错误?例如,我尝试过:
app.use(function(error,req,res,next)){
res.send('You have an error')
}
但它不起作用
换句话说:当Express Middleware返回被拒绝的承诺时,如何设置要调用的默认函数?现在我找到了一种方法,我仍在考虑更多建议
app.get("/data1",
wrap_middleware(async (req, res) => {
data1=await getData1()
res.send(data1)
})
}
app.get("/data1",
wrap_middleware(async (req, res) => {
data2=await getData2()
})
}
function wrap_middleware(func) {
return async (req, res, next) => {
func(req, res, next).catch(err => {
console.log(err.message);
res.send("Error");
});
};
}
我不明白为不同的函数发送相同的错误有什么用,但我认为处理错误代码可以用更可读的方式编写(只需捕获错误并按照您在任何路由中间件中捕获错误的方式处理它们):
如果您想要一个全局错误处理,那么它与您想要全局捕获错误的任何代码没有任何区别-您可以设置一个函数,将响应对象和异步代码作为参数,并为来自中间件(具有响应对象)的每个异步调用创建通用捕获。这正是您应该做的,是的。但是,您可能希望调用带有错误的
next
,以使用express的错误处理。
function getData1(){
return new Promise( (resolve,reject) => {
setTimeout(() =>{
reject(new Error('error has occur!'));
},2000);
});
}
router.get('/data1', async (req,res, next) => {
try{
const data = await getData1();
res.send(data);
}
catch(ex){
res.send(ex.message);
// next(ex); => sending it to express to handle it
}
});