node.js - 在 Mongoose 中寻找更新的最佳方法
问题描述
总的来说,我对 Mongoose 还是有点陌生。我正在构建我的博客应用程序,它具有基于 Node 和 MongoDB 的后端,我使用 Angular 作为前端。
我正在创建我的 Restful API,它应该允许用户点击帖子并更新它。但是,我不确定我是否在这里以正确的方式进行操作。
这是我的帖子的架构:
const mongoose = require('mongoose');
// Schema Is ONly bluePrint
var postSchema = mongoose.Schema({
title: {type: String, required: true },
content: {type: String, required: true},
}, {timestamps: true});
module.exports = mongoose.model("Post", postSchema);
在我的角度服务中,我有这个功能可以帮助我将 http 请求发送到我的后端服务器,这个功能的 id 来自后端 mongoDB,标题和内容来自页面上的表单
updatePost(id: string, title: string, content: string) {
console.log('start posts.service->updatePost()');
const post: Post = {
id: id,
title: title,
content: content
};
this._http.put(`http://localhost:3000/api/posts/${id}`, post)
.subscribe(res => console.log(res));
}
在我看来,至少有几种方法可以创建我的 API
方法 1(有效,但高度怀疑这是否是好的做法):在这里,我通过 service.ts 文件将从 mongoDB 检索到的 id 传递回服务器,以避免“修改不可变字段 _id”错误
app.put("/api/posts/:id", (req,res)=>{
console.log('update api called:', req.params.id);
const post = new Post({
id: req.body.id,
title: req.body.title,
content: req.body.content
});
Post.updateOne({_id: req.params.id}, post).then( result=> {
console.log(result);
res.json({message:"Update successful!"});
});
});
方法 2 我认为这比方法 1 更稳健,但我仍然认为它不是好的做法:
app.put("/api/posts/:id", (req, res)=> {
Post.findOne(
{_id:req.params.id},(err,post)=>{
if(err){
console.log('Post Not found!');
res.json({message:"Error",error:err});
}else{
console.log('Found post:',post);
post.title=req.body.title;
post.content=req.body.content;
post.save((err,p)=>{
if(err){
console.log('Save from update failed!');
res.json({message:"Error",error:err});
}else{
res.json({message:"update success",data:p});
}
})
}
}
);
});
我对所有意见持开放态度,希望我能从 Mongoose 和 Restful 的大师那里学到一些东西:)
解决方案
在这种情况下选择的理由findOneAndUpdate()
简单来说如下:
- 您可以使用
findOneAndUpdate()
它根据过滤器和排序标准更新文档。 - 在大多数情况下使用猫鼬时,我们更喜欢使用此功能,
update()
因为它有一个选项{new: true}
,并且在它的帮助下我们可以获得更新的数据。 - 由于您在这里的目的是更新单个文档,因此您可以使用
findOneAndUpdate()
. 另一方面update()
应该在批量修改的情况下使用。 - 由于
update()
始终返回已修改的文档,它不会返回更新的文档,并且在处理像您这样的场景时,我们总是返回更新的文档数据作为响应,因此我们应该findOneAndUpdate()
在此处使用
推荐阅读
- docker - Docker Windows:打开从 C: 开始的路径 (docker: 来自守护进程的错误响应:mkdir C:: 权限被拒绝。)
- python - 在应用 pandas to_numeric 函数时保留日期
- html - 我需要帮助以 CSS、HTML 对图像进行正确排序
- casting - Athena 要查询的 S3 文件中的混合格式:如何在表定义阶段进行转换
- python - 我可以使用 python 模块的 main 进行测试吗?
- php - Laravel 使用 @if 在页面之间切换
- python - 网址错误:
- python - 熊猫的逻辑运算问题
- facebook - 测试 Facebook Messenger 应用程序以使其接收数据的正确方法是什么?
- html - 如果弹出窗口未确认角度,则保留单选按钮的原始值