【问题标题】:NodeJs/Express/MongoDb - ERR_HTTP_HEADERS_SENTNodeJs/Express/MongoDb - ERR_HTTP_HEADERS_SENT
【发布时间】:2021-11-04 11:38:06
【问题描述】:

希望你度过了愉快的假期

我正在在线学习教程,但我有一个老师在视频中没有的错误(我也复制了他的代码,但同样的错误)。

我只在“PUT”函数中出现此错误,但奇怪的是它在 mongoDB 中更新得很好。它只是给我一个错误。

这是我的代码: user.controller.js

const UserModel = require("../models/user.model");
const ObjectID = require("mongoose").Types.ObjectId;

module.exports.getAllUsers = async (req, res) => {
  const users = await UserModel.find().select("-password");
  res.status(200).json(users);
};

module.exports.userInfo = (req, res) => {
  if (!ObjectID.isValid(req.params.id))
    return res.status(400).send("ID unknown : " + req.params.id);

  UserModel.findById(req.params.id, (err, docs) => {
    if (!err) res.send(docs);
    else console.log("Id unknown" + err);
  }).select("-password");
};

module.exports.updateUser = async (req, res) => {
  if (!ObjectID.isValid(req.params.id))
    return res.status(400).send("ID unknown : " + req.params.id);

  try {
    await UserModel.findOneAndUpdate(
      { _id: req.params.id },
      {
        $set: {
          bio: req.body.bio,
        },
      },
      { new: true, upsert: true, setDefaultsOnInsert: true },
      (err, docs) => {
        if (!err) return res.send(docs);
        if (err) return res.status(500).send({ message: err });
      }
    );
  } catch (err) {
    return res.status(500).json({ message: err });
  }
};

module.exports.deleteUser = async (req, res) => {
  if (!ObjectID.isValid(req.params.id))
    return res.status(400).send("ID unknown : " + req.params.id);

  try {
    await UserModel.remove({ _id: req.params.id }).exec();
    res.status(200).json({ message: "Successfully deleted. " });
  } catch (err) {
    return res.status(500).json({ message: err });
  }
};

user.model.js:

const mongoose = require("mongoose");
const { isEmail } = require("validator");
const bcrypt = require("bcrypt");

const userSchema = new mongoose.Schema(
  {
    pseudo: {
      type: String,
      required: true,
      minlength: 3,
      maxlength: 55,
      unique: true,
      trim: true,
    },
    email: {
      type: String,
      required: true,
      validate: [isEmail],
      lowercase: true,
      trim: true,
    },
    password: {
      type: String,
      required: true,
      max: 1024,
      minlength: 6,
    },
    picture: {
      type: String,
      default: "./upload/profil/random-user.png",
    },
    bio: {
      type: String,
      max: 1024,
    },
    followers: {
      type: [String],
    },
    following: {
      type: [String],
    },
    likes: {
      type: [String],
    },
  },
  {
    timestamps: true,
  }
);

// playfunction before save into db
userSchema.pre("save", async function (next) {
  const salt = await bcrypt.genSalt();
  this.password = await bcrypt.hash(this.password, salt);
  next();
});

// Export user
const UserModel = mongoose.model("user", userSchema);

module.exports = UserModel;

这里是终端错误:

(node:16752) [MONGODB DRIVER] Warning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead. (Use `node --trace-warnings ...` to show where the warning was created) events.js:292
      throw er; // Unhandled 'error' event
      ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:558:11)
    at ServerResponse.header (D:\Programmation\mern\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (D:\Programmation\mern\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (D:\Programmation\mern\node_modules\express\lib\response.js:267:15)
    at ServerResponse.send (D:\Programmation\mern\node_modules\express\lib\response.js:158:21)
    at D:\Programmation\mern\controllers\user.controller.js:33:30
    at D:\Programmation\mern\node_modules\mongoose\lib\model.js:4912:18
    at processTicksAndRejections (internal/process/task_queues.js:75:11) Emitted 'error' event on Function instance at:
    at D:\Programmation\mern\node_modules\mongoose\lib\model.js:4914:15
    at processTicksAndRejections (internal/process/task_queues.js:75:11) {   code: 'ERR_HTTP_HEADERS_SENT' }

这里是 PostMan 中的错误: (有关信息,如果我在邮递员中输入了错误的 ID,我的错误正如预期的那样“ID 未知:”...)

{
    "message": {
        "originalStack": "Error\n    at model.Query._wrappedThunk [as _findOneAndUpdate] (D:\\Programmation\\mern\\node_modules\\mongoose\\lib\\helpers\\query\\wrapThunk.js:25:28)\n    at D:\\Programmation\\mern\\node_modules\\kareem\\index.js:279:20\n    at _next (D:\\Programmation\\mern\\node_modules\\kareem\\index.js:103:16)\n    at D:\\Programmation\\mern\\node_modules\\kareem\\index.js:508:38\n    at processTicksAndRejections (internal/process/task_queues.js:75:11)"
    }
}

我之前改过:

catch (err) {
    return res.status(500).json({ message: err });
  }"

简单的

 console.log(err) 

并且在终端中出现了这个错误(但不再在 Postman 中):

MongooseError: Query was already executed: user.findOneAndUpdate({ _id: new ObjectId("61363178c0b345e93...
    at model.Query._wrappedThunk [as _findOneAndUpdate] (D:\Programmation\mern\node_modules\mongoose\lib\helpers\query\wrapThunk.js:21:19)
    at D:\Programmation\mern\node_modules\kareem\index.js:279:20
    at _next (D:\Programmation\mern\node_modules\kareem\index.js:103:16)
    at D:\Programmation\mern\node_modules\kareem\index.js:508:38
    at processTicksAndRejections (internal/process/task_queues.js:75:11) {
  originalStack: 'Error\n' +
    '    at model.Query._wrappedThunk [as _findOneAndUpdate] (D:\\Programmation\\mern\\node_modules\\mongoose\\lib\\helpers\\query\\wrapThunk.js:25:28)\n' +
    '    at D:\\Programmation\\mern\\node_modules\\kareem\\index.js:279:20\n' +
    '    at _next (D:\\Programmation\\mern\\node_modules\\kareem\\index.js:103:16)\n' +
    '    at D:\\Programmation\\mern\\node_modules\\kareem\\index.js:508:38\n' +
    '    at processTicksAndRejections (internal/process/task_queues.js:75:11)'
}

提前感谢您的帮助!

祝你有美好的一天:)

编辑:在 mohammad Naimi 的第一个回答之后:

我添加了其他,我仍然有同样的问题,mongodb 实际上是更新但我有错误消息

这是我更新的代码

const UserModel = require("../models/user.model");
const ObjectID = require("mongoose").Types.ObjectId;

module.exports.getAllUsers = async (req, res) => {
  const users = await UserModel.find().select("-password");
  res.status(200).json(users);
};

module.exports.userInfo = (req, res) => {
  if (!ObjectID.isValid(req.params.id))
    return res.status(400).send("ID unknown : " + req.params.id);
  else {
    UserModel.findById(req.params.id, (error, docs) => {
      if (!error) res.send(docs);
      else console.log("Id unknown" + error);
    }).select("-password");
  }
};

module.exports.updateUser = async (req, res) => {
  if (!ObjectID.isValid(req.params.id))
    return res.status(400).send("ID unknown : " + req.params.id);
  else {
    try {
      await UserModel.findOneAndUpdate(
        { _id: req.params.id },
        {
          $set: {
            bio: req.body.bio,
          },
        },
        { new: true, upsert: true, setDefaultsOnInsert: true },
        (error, docs) => {
          if (!error) return res.send(docs);
          else {
            return res.status(500).send({ message: error });
          }
        }
      );
    } catch (error) {
      return res.status(500).json({ message: error });
    }
  }
};

module.exports.deleteUser = async (req, res) => {
  if (!ObjectID.isValid(req.params.id))
    return res.status(400).send("ID unknown : " + req.params.id);
  else {
    try {
      await UserModel.remove({ _id: req.params.id }).exec();
      res.status(200).json({ message: "Successfully deleted. " });
    } catch (error) {
      return res.status(500).json({ message: error });
    }
  }
};

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    好的,经过多次尝试并失败!这是答案:使用 mongoose@5.10.6 应该很好

    祝程序员朋友们度过愉快的一天

    【讨论】:

    • 你好,谢谢你的回答,我试过了,但我还是有同样的问题
    【解决方案2】:

    好的,经过多次尝试并失败!这是答案:使用 mongoose@5.10.6 应该不错

    祝程序员朋友们度过愉快的一天

    【讨论】:

      【解决方案3】:

      使用“mongoose@5.10.6”,你的程序就可以运行了

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      【解决方案4】:

      第一种解决方案:降级您的 Mongoose 版本(以 5.10.13 为例)

      第二个解决方案:不要使用回调函数,而是使用.then(使用 Mongoose 6.0.13):


       module.exports.updateUser = async (req, res) => {
        if (!ObjectID.isValid(req.params.id))
          return res.status(400).send("ID invalid : " + req.params.id);
      
        try {
          await UserModel.findOneAndUpdate(
            { _id: req.params.id },
            {
              $set: {
                bio: req.body.bio,
              },
            },
            { new: true, upsert: true, setDefaultsOnInsert: true }
          )
            .then((docs) => res.send(docs))
            .catch((err) => res.status(500).send({ message: err }));
        } catch (err) {
          res.status(500).json({ message: err });
        }
      };
      

      【讨论】:

        猜你喜欢
        • 2020-03-25
        • 1970-01-01
        • 2022-01-17
        • 2022-11-22
        • 1970-01-01
        • 2022-09-23
        • 2021-03-17
        • 1970-01-01
        • 2011-09-14
        相关资源
        最近更新 更多