在promise-chain中传递引用函数的值

Pass values from referenced function in promise-chain?

本文关键字:函数 引用 promise-chain      更新时间:2023-09-26

我正在为Express应用程序编写一些渲染代码,我希望捕获错误,然后在函数渲染中输出它们,但我不确定如何将它们从一个方法移动到另一个。

app.get('/user/makeRider', auth,
    (req, res, next) => {
        req.user.user.makeRider(req.query)
            .catch(error)
            .then(render(req, res));
    }
);
var render = (req, res) => {
    var response = {
        params: req.query,
        user: req.user.fulluser
    };
    res.json(response);
},
error = (reason) => {
    reason.errors.forEach((error) =>{
        console.log(error);
    });
    return;
};

您可以使用错误函数作为链中的最后一个中间件,并简单地将请求传递给下一个链:

var render = (req, res) => {
    var response = {
        params: req.query,
        user: req.user.fulluser
    };
    res.json(response);
}
app.get('/user/makeRider', auth,
    (req, res, next) => {
        req.user.user.makeRider(req.query)
            .catch(next)
            .then(render(req, res));
    }
);
app.use((reason, req, res, next) => {
    res.send(reason.errors);
    // or you can send them as json: res.status(404).json({errors: reason.errors})
});

注意代码中的提升问题,变量声明被提升到顶部,而不是它们的赋值,error和render函数在从路由访问时可能显示为未定义。

一个快速但可能不是最优雅的解决方案是将错误作为参数添加到渲染函数中,然后您可以这样做:

app.get('/user/makeRider', auth,
    (req, res, next) => {
        req.user.user.makeRider(req.query)
            .catch((reason)=>{
             render(req, res, reason.errors)
            })
            .then(render(req, res));
    }
);
var render = (req, res, errs) => {
    var response = {
        params: req.query,
        user: req.user.fulluser
    };
    res.json(response);
};