我完全坚持Mongoose
并删除方法。
我有一个带有评论和表单的页面,带有一个按钮Delete
。我的目标是仅删除被点击的评论。下面是我的MongoDB
文件(顺便说一下,我使用override
库的方法express
来处理请求发布和删除。)
{
"_id": {
"$oid": "5a455cf460414f548f3d1afb"
},
"title": "Tets",
"body": "tes",
"user": {
"$oid": "5a440bae124b7e4626aeeb70"
},
"date": {
"$date": "2017-12-28T21:07:00.194Z"
},
"comments": [
{
"commentBody": "ets",
"commentUser": {
"$oid": "5a440bae124b7e4626aeeb70"
},
"_id": {
"$oid": "5a455cf660414f548f3d1afc"
},
"commentDate": {
"$date": "2017-12-28T21:07:02.143Z"
}
}
],
"allowComments": true,
"status": "public",
"__v": 1
}
我的架构
const mongoose = require('mongoose')
const Schema = mongoose.Schema;
//Create Schema
const StorySchema = new Schema({
title: {
type: String,
required: true
},
body: {
type: String,
required: true
},
status: {
type: String,
default: 'public'
},
allowComments: {
type: Boolean,
default: true
},
comments: [{
commentBody: {
type: String,
required: true
},
commentDate: {
type: Date,
default: Date.now
},
commentUser: {
type: Schema.Types.ObjectId,
ref: 'users'
}
}],
user: {
type: Schema.Types.ObjectId,
ref: 'users'
},
date: {
type: Date,
default: Date.now
}
});
mongoose.model('stories',StorySchema, 'stories');
我的JS文件,我的post方法完全符合我的意愿,但删除根本不起作用(无法读取未定义的属性'comments')
router.post('/comment/:id' , (req , res) => {
Story.findOne({
_id: req.params.id
})
.then(story => {
const newComment = {
commentBody: req.body.commentBody,
commentUser: req.user.id
}
//Push to comments array
story.comments.unshift(newComment);
story.save()
.then(story => {
res.redirect(`/stories/show/${story.id}`)
})
});
})
router.delete('/comment/:id', (req, res) => {
Story.remove({
_id: req.body.id.comments
})
.then(() => {
req.flash('success_msg', 'Comments Removed!');
res.redirect('/dashboard');
})
});
这是我的带有表单的把手文件
{{#each story.comments}}
<form action="/stories/comment/{{id}}?_method=DELETE" method="post" id="delete-form"> <input type="hidden" name="_method" value="DELETE"> <button type="submit" class="btn red"><i class="fa fa-remove"></i> Delete</button> </form> {{/each}}
我得到的错误
TypeError: Cannot read property 'comments' of undefined
at router.delete (/Users/ar2z/Desktop/fierce-caverns-70427/routes/stories.js:197:20)
请帮帮我。我完全迷失了。
答案 0 :(得分:0)
我最近遇到了同样的错误。我发现你需要这样做:
router.delete("/comments/:id", function(req,res){
var Model = require("myModel");
//Run a find and update query to delete the comment
Model.findOne({_id:req.params.id}, function(err,doc){
if(doc && !err){
doc.comments = doc.comments.filter(function(comment){
//This will filter out the comment you want to delete
return comment._id != req.body.commentId
})
}
res.redirect("/comments/")
})
}
答案 1 :(得分:0)
我的错是从一开始我尝试使用数组元素的方式与我使用Mongo对象的方式相同
Story.remove({
_id: req.body.id.comments
})
上面的代码不适用于使用object的数组元素,但是对于我使用的数组中的delete元素:
Story.update( { }, { $pull: { comments: { _id: req.params.id }}}, { multi: true } )
此代码从文档数组中删除项目