代码之家  ›  专栏  ›  技术社区  ›  dokichan

Express中ERR\u HTTP\u HEADERS\u发送错误的原因。js中间件

  •  0
  • dokichan  · 技术社区  · 2 年前

    我创建了中间件来验证body中的字段,如下所示:

    前端路线:

    router.post('/s-i', async (req, res) => {
      try {
        const { data } = await api.post('/sign-in', req.body)
    
        res.cookie("_rt", data._rt, { httpOnly: true, secure: false })
        delete data._rt
    
        return res.json(data)
      } catch (e) {
        // Here is error
        return res.status(e.response.status).json(e.response.data)
      }
    });
    

    router.post('/sign-in', v(['email', 'password', 'twoFa', 'phone']), wrapAsync(userController.signIn));
    

    中间件:

    exports.v = fields => {
      return (req, res, next) => {
        fields.forEach(field => {
          if (req.body[field]) {
            const result = require(`./validators/${field}`)(req.body[field])
            if (!result)
              return res.status(400).json({ message: 'bad-request', status: 400 })
          }
        })
        next()
      }
    }
    

    在注释放置的地方,我可以看到这个错误,实际上,所有的工作都可以找到,如果正文前面有错误的字段,将收到400个状态代码,但在后端终端,我仍然有这个错误,无法找到原因。

    问题是我一直在弄这个 ERR_HTTP_HEADERS_SENT res.send({}) 两次,但我真的不明白这个问题的原因。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Heiko Theißen    2 年前

    这个 return res.status(400)... fields.forEach(field => {...}) ,但必须从中间件函数返回,否则 next() .json 输出,导致观察到的错误。

    您可以通过替换 具有

    for (var field of fields) {
      if (req.body[field]) {
        const result = require(`./validators/${field}`)(req.body[field])
        if (!result)
          return res.status(400).json({ message: 'bad-request', status: 400 })
      }
    }