首页 > 解决方案 > 发出 POST 请求时出现 Nodejs 错误 [ERR_HTTP_HEADERS_SENT]

问题描述

我是 NODEJS / express 的新手,我正在按照教程构建一个小型 MERN 应用程序。在最初的步骤中,在设置 POST 路由时,当使用 Postman 发送 POST 请求时,我得到了这个我已经Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 阅读过的内容,我以某种方式理解是因为我res.json在同一个响应中调用了两次。

我的路由器是这样的:

router.post('/login',
    async (req, res) => {

      try {
          const user = await userModel.findOne({email:req.body.email});
          !user && res.status(404).send("user not found");

          const correctPassword = await bcrypt.compare(req.body.password, user.password);
          !correctPassword && res.status(400).json('incorrect password') 
          
           res.status(200).json(user); // if not invalid  return user

          } catch (err) {
            console.log(err)
          }
      
     })

我尝试了在这里找到的不同解决方案(IF & if Else 语句,使用return ...),但没有成功。这个相同的代码(具有不同的变量名)在提到的教程中运行完美。

知道我该如何解决吗?提前致谢。

编辑:我添加了我的用户路线的恢复'''

import express from 'express';
   const router = express.Router(); 
   import bcrypt from 'bcrypt';
   import userModel from '../models/userModel.js'

router.post('/register',
    async (req, res) => {
      
      try {

        // hash password
        const salt = await bcrypt.genSalt(10);
        const hashedPassword = await bcrypt.hash(req.body.password, salt)

        // Create New User
        const newUser = new userModel({
          userName: req.body.userName,
          email: req.body.email,
          password: hashedPassword,
        });

        // Save New User and return response
        const user = await newUser.save();
        res.status(200).json(user);
      } catch(err){
        console.log(err)
      }  
    });

标签: node.jsmongodbexpress

解决方案


可能用户是假的或正确密码评估为假,这将发送“找不到用户”或“密码错误”的响应。

但是,它会继续执行您的函数的其余部分并最终执行此行

res.status(200).json(user);

此行将导致您提到的错误,因为您之前已经向客户端发送了响应,并且无法在同一请求响应周期中发送另一个响应。

这应该可以解决问题:

router.post("/login", async (req, res) => {
  try {
    const user = await userModel.findOne({ email: req.body.email });
    if (!user) {
        return res.status(404).send("user not found");
    }

    const correctPassword = await bcrypt.compare(req.body.password, user.password);
    if (!correctPassword) {
        return res.status(400).json("incorrect password");
    }

    return res.status(200).json(user); // if not invalid  return user
  } catch (err) {
    console.log(err);
    return res.status(500).send(err.message);
  }
});

我建议在这里使用 ifs,因为它使代码更易于阅读。我还建议您在发送回复时使用 return,因为它可以避免您遇到的问题。


推荐阅读