Express. js ошибка приложения: не удалось удалить маршрут поста - PullRequest
0 голосов
/ 02 марта 2020

Я работаю над приложением для ведения блога (нажмите на ссылку, чтобы увидеть репозиторий GitHub ) с Express, E JS и MongoDB.

Мне не удалось удалить сообщение с помощью AJAX.

В моем файле маршрутов Dashboard (routes\admin\dashboard.js) у меня есть:

// Delete Post
router.delete('/post/delete/:id', dashboardController.deletePost);

В моем контроллере Dashboard :

exports.deletePost = (req, res, next) => {
    const postId = req.params.id;
    posts.findByIdAndRemove(postId, function(err){
        if (err) {
            console.log('Error: ', err);
        }
        res.sendStatus(200);
    });
}

В представлении, в котором перечислены сообщения в таблице, с кнопками "Редактировать" и кнопкой "Удалить" для каждого, что у меня есть :

<% if (posts) { %>
    <% posts.forEach(function(post) { %>
        <tr data-id="<%= post._id %>" class="d-flex">
            <td class="col-1"></td>
            <td class="col-4 col-lg-5">
                <%= post.title %>
            </td>
            <td class="col-2"></td>
            <td class="col-2"></td>
            <td class="col-3 col-lg-2 text-right">
                <div class="btn-group">
                    <a href="#" class="btn btn-sm btn-success">Edit</a>
                    <a href="#" class="btn btn-sm btn-danger delete-post" data-id="<%= post._id %>">Delete</a>
                </div>
            </td>
        </tr>
        <% }); %>
<% } else { %>
        <tr>
           <td colspan="5">There are no posts</td>
        </tr>
<% } %>

Наконец, в public\assets\js\admin.js У меня есть:

$(document).ready(function(){
  $('.delete-post').on('click', function(evt){
    evt.preventDefault();
    let postId = $(this).data('id');
    if(confirm('Delete this post?')) {
      $.ajax({
        url: '/post/delete/' + postId,
        method: 'GET',
        success: function(deleteMsg){
          $('tr[data-id="' + postId +'"]').fadeOut('250');
        }
      });
    }
  });
});

У меня этого было достаточно для успешной операции удаления, но это не так.

ОБНОВЛЕНИЕ:

Если я заменю url: '/post/delete/' + postId, на url: '/dashboard/post/delete/' + postId,, я получу 500 internal server error. Я вижу posts is not defined во вкладке сети.

Что мне не хватает?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Я сделал это так , для полного примера запуска клон обновлен нод-чит-код XPressBlog и индекс узла запуска, за которым следует npm i.

добавлено delete в маршруты / интерфейс / сообщения. js, например:

// Delete Single Post
router.delete('/:id', postsController.deleteSinglePost);

добавлено deleteSinglePost в контроллеры / интерфейс /posts.js, например:

exports.deleteSinglePost = (req, res, next) => {
    const {id} = req.params;
    res.send(`This will DELETE post with id : ${id}`);
};

Это делается на основе просмотра index.js, то есть:

const dashboardRoute = require("./routes/admin/dashboard");
app.use('/dashboard', dashboardRoute);

const postsRoute = require('./routes/front-end/posts');
app.use('/', postsRoute);

curl -X УДАЛИТЬ http://localhost: 3000/100 :

УДАЛИТЬ сообщение с идентификатором: 100

0 голосов
/ 02 марта 2020

Я решил проблему следующим образом:

1) Я заменил posts.findByIdAndRemove на Post.findByIdAndRemove:

exports.deletePost = (req, res, next) => {
    const postId = req.params.id;
    Post.findByIdAndRemove(postId, function(err){
        if (err) {
            console.log('Error: ', err);
        }
        res.sendStatus(200);
    });
}

2) Я заменил url: '/post/delete/' + postId, на url: '/dashboard/post/delete/' + postId, в мой jQuery фрагмент.

...