Как удалить комментарий из сообщения на узле, express и пн goose и Ajax - PullRequest
0 голосов
/ 06 апреля 2020

Пожалуйста, мне нужна помощь, как удалить один комментарий из сообщения. когда я нажимаю удалить, возвращаю 500 error. некоторые вещи, которые меня смущают, это то, что если я передам и ссылки, и идентификаторы комментариев по ссылке, как я скажу Ajax, что это для постов, а этот для комментариев. Вот моя схема сообщений

 const postSchema = new mongoose.Schema({
    title: {
       type: String,
       required: true
    },
    description: {
      type: String,
      required: true
    },
   from: {
      type: String,
      required: true
   },
   createdAt: { 
     required: true, 
     default: Date.now
  },
  postImage: {
    type: String,
    require: true
  },
  comments: [{ type: Schema.Types.ObjectId, ref: 'Comment' }]

 })

вот моя ajax из основного. js файла.

/deleting comment with Ajax
$(document).ready(function() {
  $('.delete-comment').on('click', function(e) {
    const $target = $(e.target);
    const id = $target.attr('data-id');
    $.ajax({
        type: 'DELETE',
        url: '/posts/comments/'+id,
        success: function(response) {
            window.location.href='/posts';
        },
        error: function(err){
            console.log(err);
        }
    });
  }); 
});

мои маршруты / комментарии

//Delete comment inside a post
router.delete( '/comments/:id', function( req, res ){
  const post = Post.findOne({_id: req.params.postId});
  const ObjectId = mongoose.Types.ObjectId;

  let query = {_id:new ObjectId(req.params.id)}
  console.log(query)

  post.comments.delete(query, function(err) {
    if(err){
     console.log(err);
   }
   res.send('Success');
 });
})

мои взгляды / index.e js

 //Comments and link
<% const counter = post.comments.length >= 2 ? "Comments" : "Comment"; %>
<button class="show-comments"><%= post.comments.length + " " + counter + "" %></button>
<% %>
<div class="postcomments" ><% post.comments.forEach(item => { %>
  <ul >
    <li><%= item.description %></li>
    <a class="delete-comment" href="#" data-id="<%=item._id%>">Delete</a>

 </ul>
<% });%>

мое приложение. js

//use route from app.js 
var commentRouter = require('./routes/comments');
app.use('/posts', commentRouter);

вот что возвращается на мой терминал

DELETE /posts/comments/5e8ad7121277855e656b3379 500 5.395 ms - 3698

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вам нужно знать как postId, так и commentId, чтобы можно было удалить комментарий из коллекции сообщений. Также было бы хорошо удалить комментарий внутри коллекции комментариев.

Поэтому измените ваш маршрут удаления, включив в него postId и commentId как req.params. Вы можете удалить комментарий из сообщений, используя метод findByIdAndUpdate и оператор $pull.

router.delete("/comments/:postId/:commentId", async function (req, res) {
  try {
    const post = await Post.findByIdAndUpdate(
      req.params.postId,
      {
        $pull: { comments: req.params.commentId },
      },
      { new: true }
    );

    if (!post) {
      return res.status(400).send("Post not found");
    }

    await Comment.findByIdAndDelete(req.params.commentId);

    res.send("Success");
  } catch (err) {
    console.log(err);
    res.status(500).send("Something went wrong");
  }
});

TEST

Допустим, у нас есть этот документ с 3 комментарии.

Сообщений:

{
    "_id" : ObjectId("5e8b10c49ae619486094ed10"),
    "comments" : [
        ObjectId("5e8b104f9ae619486094ed0d"),
        ObjectId("5e8b10599ae619486094ed0e"),
        ObjectId("5e8b105e9ae619486094ed0f")
    ],
    "title" : "Title",
    "description" : "Description...",
    "from" : "From",
    "postImage" : "Post Image",
    "createdAt" : ISODate("2020-04-06T14:21:40.884+03:00")
}

Комментарии:

{
    "_id" : ObjectId("5e8b105e9ae619486094ed0f"),
    "message" : "Comment 3"
},

{
    "_id" : ObjectId("5e8b10599ae619486094ed0e"),
    "message" : "Comment 2"
},
{
    "_id" : ObjectId("5e8b104f9ae619486094ed0d"),
    "message" : "Comment 1"
}

Если мы хотим удалить комментарий с помощью _id:5e8b10599ae619486094ed0e, нам нужно отправить запрос на УДАЛЕНИЕ наш маршрут с использованием URL-адреса выглядит следующим образом:

http://localhost:3000/posts/comments/5e8b10c49ae619486094ed10/5e8b10599ae619486094ed0e

5e8b10c49ae619486094ed10 - это postId, 5e8b10599ae619486094ed0e - это идентификатор комментария.

Результат будет выглядеть так:

Posts:

{
    "_id" : ObjectId("5e8b10c49ae619486094ed10"),
    "comments" : [
        ObjectId("5e8b104f9ae619486094ed0d"),
        ObjectId("5e8b105e9ae619486094ed0f")
    ],
    "title" : "Title",
    "description" : "Description...",
    "from" : "From",
    "postImage" : "Post Image",
    "createdAt" : ISODate("2020-04-06T14:21:40.884+03:00")
}

Комментарии:

{
    "_id" : ObjectId("5e8b105e9ae619486094ed0f"),
    "message" : "Comment 3"
},
{
    "_id" : ObjectId("5e8b104f9ae619486094ed0d"),
    "message" : "Comment 1"
}
0 голосов
/ 06 апреля 2020

Ваш маршрут nodejs / express содержит этот код. Возможно, он должен делать больше с возможными ошибками: в частности, передать ошибку в функцию next(), которая является третьим параметром любого обработчика маршрута.

post.comments.delete(query, function(err) {
    if(err){
         console.log(err)
         return next(err)
     }
     res.send('Success')
});

Передача значения ошибки в next() должна доставить ошибку сообщение пользователю. И у вас есть то же сообщение, которое отображается в console.log вашего сервера. Так что, если ошибка оттуда, вы должны узнать больше об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...