【发布时间】:2019-04-16 21:03:36
【问题描述】:
我正在构建一个 CRUD 应用程序的后端。我目前有一个/diagrams/update:id 的 POST 路由设置,我可以在其中使用通过 Postman 发送的正文覆盖 MongoDB 文档。
我可以成功更新文档,但是当我尝试只更新文档中的一个数据时,其他所有数据都会被删除。
我希望我的代码 1) 检测我要更改的内容是否与数据库中的数据不同,2) 仅当不同时,更新记录,3) 如果没有更改,则不更新并将当前数据保存在数据库中。
我试图做类似的事情
if (diagram.name !== req.body.name) {
diagram.name = req.body.name}
但这意味着我必须为每一个更改编写该逻辑。
server.js
router.route('/diagrams/update/:id').post((req, res)=> {
mySchema.findById(req.params.id, (err, diagram) => {
if (!diagram)
return next(new Error('Could not load doc!'))
else {
// I tried something like
// if (diagram.name !== req.body.name) {
// diagram.name = req.body.name}
// but that only works one at a time
diagram.name = req.body.name;
diagram.creator = req.body.creator;
diagram.customer = req.body.customer;
diagram.save().then( diagram => {
res.json('Update done!')
}).catch(err => {
res.status(400).send('Update faileddddd')
})
}
})
})
MySchema.js
const mongoose = require( 'mongoose');
const Schema = mongoose.Schema;
let mySchema = new Schema({
name: {
type: String
},
creator: {
type: String
},
customer: {
type: String
}
}, {collection: `fivo`})
【问题讨论】:
-
您是否在每个请求中都传递了
name、creator和customer?我首先想到的是为什么要删除数据,如果您不是,或者您将它们作为空白或空值传递。 -
Object.assign(diagram, req.body) -
当您只传入
name时,只会更新名称。当您传入name、creator和customer时,是的,它作为空白传递并更新为空白值。稍后当我构建前端界面时,我需要用户只有在发生变化时才能编辑每个字段。这是否意味着我仍然必须每次都传递name、creator和customer?
标签: javascript node.js mongodb mongoose crud