【问题标题】:Load specific middlewear instead of using next();加载特定的中间件而不是使用 next();
【发布时间】:2016-07-16 15:54:39
【问题描述】:

我有几条这样的路线:

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)

也许可以通过某种方式替换路由中的中间件设置。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

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

    【讨论】:

    • 这听起来像我要找的东西!这是叫什么还是有任何文档? new Error(smth-data) 有什么作用?
    • 我在 Express 网站上没有找到更多文档,但它是不需要任何额外代码的标准方法:使用 Error 简单调用 next 并在错误中间件 (expressjs.com/en/guide/error-handling.html) 中中断它。
    • smth 指的是什么?
    • 您可以放置​​任何字符串或 json.stringified 对象。您还可以为每个路由创建单独的错误处理程序:处理程序必须检查错误消息并决定 - 继续请求或下一步转发。 Error-middlewares 使链类似正常的中间件。
    • 我遇到了一些麻烦:stackoverflow.com/questions/38415430/…
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      有很多方法可以解决这个问题。一种方法是使用.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处的渲染函数。

      【讨论】:

        猜你喜欢
        • 2022-06-14
        • 1970-01-01
        • 2011-07-19
        • 2019-06-05
        • 2021-01-31
        • 1970-01-01
        • 2021-06-22
        • 2020-12-07
        • 1970-01-01
        相关资源
        最近更新 更多