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

我有几条这样的路线:

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

当validation失败时,我想跳过所有的middlewear,并运行渲染function,与REQ,水库我不能使用next(); 因为我不知道我在哪里的顺序,有没有其他的方式来调用res, req and next();参数的特定函数res, req and next(); (我的validation没有访问这些参数,所以我不能这样做

 render(res, req, next) 

也许有些方法可以取代路线中的中间装备。

       

网上收集的解决方案 "加载特定的中间衣物,而不是使用next();"

我build议调用next(new Error(smth-data)); 并使用4个参数在错误中间件中呈现。 或者你想为每个路线特别渲染?

挖出堆栈溢出后,我发现这个职位 。 这可能会给你一些提示。

基本上如果你可以使渲染采取这样的4个参数

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

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

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

有很多方法可以解决这个问题。 一种方法是使用.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); 

这将在每个中间件函数的开始处为rendercallback添加一个新的参数,所以您只需将它们添加到它们的声明中,然后可以访问所需的render()函数并在需要时调用它。


另一种方法是创build一个新的中间件,它只是将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的渲染函数。