加载特定的中间件而不是使用next();

时间:2016-07-16 15:54:40

标签: node.js express

我有几条这样的路线:

app.post('/user/me',        c.auth, c.striper.make,     c.user.edit,        c.user.requestDriver,       render);
app.post('/user/:id',       c.auth, c.targetUser,       c.user.makeDriver,  c.user.makeAdmin,           render);

当验证失败时,我想跳过所有的中间装并运行渲染函数,使用req,res我不能使用next();因为我不知道我的顺序在哪里,是否有其他方法使用参数res, req and next();调用特定函数(我的验证无法访问这些参数,所以我不能只做

render(res, req, next)

可能有一些方法可以替换路线中的中间装置。

3 个答案:

答案 0 :(得分:2)

我建议调用next(new Error(smth-data));并使用4个参数在Error-middleware中渲染。或者你想要为每条路线进行特殊渲染?

答案 1 :(得分:0)

在挖出堆栈溢出后,我找到了this post。它可能会给你一些暗示。

基本上如果你可以使渲染能够采用像这样的4个参数

function (err, req, res, next) {}

那么你可以通过将错误传递给next()来跳转到那里

next({ type: 'database', error: 'datacenter blew up' });

答案 2 :(得分:0)

有很多方法可以解决这个问题。一种方法是使用.bind()render函数传递给每个中间件函数。然后,当您决定要完成请求链时,您只需致电render()而不是致电next()

app.post('/user/me', c.auth.bind(null, render), c.striper.make.bind(null, render),
    c.user.edit.bind(null, render), c.user.requestDriver.bind(null, render), render);

这将在每个中间件函数的开头为渲染回调添加一个新参数,因此您只需将其添加到其声明中,然后您就可以访问所需的render()函数,并在需要时调用它

另一种方法是创建一个新的中间件,只需将render函数添加到req对象,然后它就可供所有中间件使用,以便您可以随时调用它。

app.post('/user/me',  setReqArg("renderFn", render), c.auth, c.striper.make, c.user.edit, c.user.requestDriver, render);

function setReqArg(propName, propValue) {
    return function(req, res, next) {
        req[propName] = propValue;
        next();
    }
}

执行此操作后,所有中间件都可以访问req.renderFn处的渲染功能。