如何为我的所有Express中间件设置默认拒绝承诺行为?

时间:2017-01-23 13:19:02

标签: javascript node.js express

我在快递中间件中使用promises。我想使用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  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中间件返回被拒绝的承诺时设置要调用的默认函数?

2 个答案:

答案 0 :(得分:1)

现在我找到了一种方法,我仍然可以提出更多建议的问题

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");
        });
    };
}

答案 1 :(得分:0)

我不理解使用为不同的函数发送相同的错误,但我认为处理错误代码可以用更易读的方式编写(只是捕获错误并按照你想要的方式处理它们捕获任何路由中间件中的错误):

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
    }
});

如果你想要一个全局错误处理,那么它与你想要全局捕获错误的任何代码没有任何不同 - 你可以设置一个作为参数,响应对象和异步代码的函数,并为每个异步调用创建一般捕获来自中间件(具有响应对象)