首页 > 解决方案 > 为什么 Mongoose 将我的帖子对象添加到用户的收藏中?

问题描述

我有这样的路线向用户架构添加新帖子:

Router.route("/newpost").post(function(req, res) {
  UserSchema.findById(req.body.user).then((user) => {
    const id = function() {
      return (
        "_" +
        Math.random()
          .toString(36)
          .substr(2, 9)
      );
    };
    req.body.data.key = id();
    user.posts.unshift(req.body.data);
    user.save();
    res.send(user);
  });
});

这是我的用户架构:

const mongoose = require("mongoose")
const Schema = mongoose.Schema

const UserSchema = new Schema({
    name : {
        type: String
    },
    login : {
        type: String
    },
    posts : {
        type : Array
    },
    email : {
        type: String
    },
    password : {
        type: String
    },
})

module.exports = mongoose.model("UserSchema", UserSchema, "users")

因此,如您所见,我正在将我的新帖子推送到当前用户的帖子数组中,但 Mongodb 也将此帖子作为空对象保存到用户集合中。这是我在推送新帖子时得到的结果: Robo 3T 的截图

如您所见,新帖子已添加到帖子数组中,但它也显示为我的用户对象下方的空对象。我该如何解决?谢谢!

标签: node.jsmongodbreactjsexpressmongoose

解决方案


在浏览了您的代码库之后,我想我已经弄清楚发生了什么,并且可以为您指明正确的方向。恐怕我对您的反应应用程序的结构了解不够,无法提供修复。

问题发生在客户端,而不是服务器上


我使用postman向我的本地服务器实例发送了以下两个 API 请求:

POST /api/add
{
    "name": "sam",
    "password": "example",
    "login": "samholmes",
    "email": "sam@sam.com"
}
response
{
    "_id" : "5b4cb4a3dcf25c13bdd05f80",
    "friends" : [],
    "requests" : [],
    "posts" : [],
    "name" : "sam",
    "password" : "$2b$10$G65S4St8OZWrhf0mSu3mduVyZRpycT5TMP3unM2GTdfOTXJaeChXK",
    "login" : "samholmes",
    "email" : "sam@sam.com",
    "__v" : 0
}
POST /api/newpost
{
    "user": "5b4cb4a3dcf25c13bdd05f80",
    "data": {
        "key": null,
        "title": "Example title",
        "text": "Example content"
    }
}
response
{
    "friends": [],
    "requests": [],
    "posts": [
        {
            "key": "_2utqr2k53",
            "title": "Example title",
            "text": "Example content"
        }
    ],
    "_id": "5b4cb4a3dcf25c13bdd05f80",
    "name": "sam",
    "password": "$2b$10$G65S4St8OZWrhf0mSu3mduVyZRpycT5TMP3unM2GTdfOTXJaeChXK",
    "login": "samholmes",
    "email": "sam@sam.com",
    "__v": 0
}

Robo 3T 中的单品

如您所见,它只创建了一个用户项并将帖子添加到posts数组中(如您所料)。这意味着服务器处理请求的方式没有问题,而是客户端的某个地方发送了错误的请求。


好的,让我们使用 React 应用程序。登录后,我输入以下详细信息并点击“提交”按钮。

反应形式 提交结果网络请求

嗯?两个网络请求刚刚通过。我们想要的:/newpost,它正确地用新帖子更新用户,还有这个其他/add请求(它添加了一个新的空用户并导致您遇到的问题)。为什么要发送这个?

我挖了一下,似乎smart/Feed/NewPost:42是罪魁祸首:

this.props.newPost(data, _id);

这会导致 React 调用handleSubmit你想要的 API 路由和你不想要的路由。


恐怕我现在无法弄清楚为什么这个按钮会导致两个网络请求,但希望它足以为您指明正确的方向!


推荐阅读