我有将新帖子添加到用户架构的途径:
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")
因此,如您所见,我正在将新帖子推送到当前用户的posts数组中,但是Mongodb还将此帖子作为空对象保存到Users集合中。这是我推送新帖子时得到的: screenshot from the Robo 3T
如您所见,新帖子已添加到posts数组,但在我的用户对象下方也显示为空对象。 我该如何解决? 谢谢!
答案 0 :(得分:2)
浏览your codebase之后,我想我已经知道发生了什么事,可以为您指明正确的方向。恐怕我对您的React应用程序的结构了解不足,无法提供修复程序。
我使用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
}
如您所见,它仅制作了一个用户项目,并将帖子添加到posts
数组中(如您所愿)。这意味着服务器处理请求的方式没有问题,而是服务器在客户端中的某个地方发送了错误的请求。
好的,让我们使用React应用程序。登录后,输入以下详细信息,然后单击“提交”按钮。
嗯?刚刚完成了两个网络请求。我们想要的一个是/newpost
,它可以用新帖子正确地更新用户,还可以更新另一个/add
请求(这将添加一个新的空用户并引起您遇到的问题)。为什么会发送此邮件?
我已经挖了一点,似乎smart/Feed/NewPost:42
是元凶:
this.props.newPost(data, _id);
这会导致React为您想要的API路由和您不需要的API路由调用handleSubmit
。
恐怕我现在无法弄清楚为什么此按钮会导致两个网络请求,但希望这足以将您指向正确的方向!