Express.js 应用程序错误:删除 post 找不到路由

Express.js application bug: delete post route is not found

我正在研究 blogging application (click the link to see the GitHub repo) with Express, EJS 和 MongoDB。

我无法通过 AJAX 删除 post。

在我的 仪表板 路由文件 (routes\admin\dashboard.js) 中,我有:

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

在我的仪表板控制器中:

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

在 table 中列出 post 的视图中,每个按钮都有 "Edit" 和 "Delete" 按钮:

<% 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: '/dashboard/post/delete/' + postId, 替换 url: '/post/delete/' + postId,,我会得到 500 internal server error。我在网络选项卡中看到 posts is not defined

我错过了什么?

我是这样做的,为了完成 运行ning 示例克隆 更新 node-cheat XPressBlog 和 运行 节点索引后跟 npm i.

delete 添加到 routes/front-end/posts.js,例如:

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

deleteSinglePost 添加到 controllers/front-end/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 DELETE http://localhost:3000/100:

This will DELETE post with id : 100

我是这样解决问题的:

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) 我在 jQuery 片段中用 url: '/dashboard/post/delete/' + postId, 替换了 url: '/post/delete/' + postId,