我有几条这样的路线:
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)
可能有一些方法可以替换路线中的中间装置。
答案 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
处的渲染功能。