node.js - 为什么 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 的截图
如您所见,新帖子已添加到帖子数组中,但它也显示为我的用户对象下方的空对象。我该如何解决?谢谢!
解决方案
在浏览了您的代码库之后,我想我已经弄清楚发生了什么,并且可以为您指明正确的方向。恐怕我对您的反应应用程序的结构了解不够,无法提供修复。
问题发生在客户端,而不是服务器上
我使用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 调用handleSubmit
你想要的 API 路由和你不想要的路由。
恐怕我现在无法弄清楚为什么这个按钮会导致两个网络请求,但希望它足以为您指明正确的方向!
推荐阅读
- debugging - 在 VSCode 中调试 Rust,库上没有调试符号,但在示例中调试符号
- c# - 在 C# 中解析 JSON 的层
- sql-server - 如何在 SQL Server 中对 concat 进行分组
- regex - Notepad ++ 仅搜索和替换文本 2 个特定行
- python - 使用 Django 向现有 Docker 容器添加/公开端口
- php - wordpress中的PHP CURL连接超时问题
- javascript - javascript中的window.focus()
- ros - Rviz:如何通过代码设置 TopDownOrtho 视图的 X、Y
- sql - 如何在 2 列上旋转
- php - LEFT JOIN 每次都为空