Express.js CRUD应用程序错误:更新功能未正确重定向

时间:2019-06-29 10:16:19

标签: javascript node.js express

更新:

Matus Dubrava,您是正确的核心,但是我将该行更改为res.redirect('/post/show/' + pid);,但仍然无效。路线为http://localhost:3000/post/edit/5d0fddd730d83f0c32c1e0ca

负责显示单个帖子的代码片段确实起作用。是:

app.get('/post/show/:id', function(req, res){
    Post.findById(req.params.id, function(err, post){
        res.render('single_post.pug', {
            post: post
        });
    });
});

但是,使用res.redirect('/post/show/' + pid);重定向仍然无效。

我正在使用 Node MongoDB Express 开发基本的CRUD应用程序。我将Jade用作视图广告和Bootstrap 4的样式。

有一个编辑帖子功能可以正常运行,但是我的更新存在一个我无法发现和修复的错误:

编辑表单视图:

h2 #{title}

form(action="/post/edit/" + post._id, method="POST")
    .form-group
        input.form-control(type="hidden", name="post_id", value=post.post_id)
    .form-group
        input.form-control(type="text", name="title", placeholder="Post title" value=post.title)
    .form-group
        input.form-control(type="text", name="category", placeholder="Post category" value=post.category)
    .form-group
        textarea.form-control(rows="5", name="body")= post.body
    .form-group
        input.btn.btn-sm.btn-block.btn-primary(type="submit", value="Update")

修改更新操作相对应的代码:

// Edit post
app.get('/post/edit/:id', function(req, res){
    Post.findById(req.params.id, function(err, post){
        res.render('edit_post.pug', {
            post: post
        });
    });
});


// Update post
app.post('/post/edit/:id', function(req, res){
    let post = {};
    post.pid = req.body.post_id;
    post.title = req.body.title;
    post.category = req.body.category;
    post.body = req.body.body;

    let query = {_id:req.params.id}

    Post.update(query, post, function(err){
        if (err) {
            console.log(err);
            return;
        } else {
            res.redirect('/post/show/' + pid);
        }
    });
});

帖子确实得到更新,但是:

  1. 重定向网址为http://localhost:3000/post/show/:pid;
  2. 浏览器显示Cannot read property 'title' of undefined

我的错误在哪里?

PS::我无法在此处添加所有代码,因此我将 this 粘贴到了一起。

3 个答案:

答案 0 :(得分:3)

在调用重定向时,此/post/show/:pid只是一个普通的字符串,您也可以从URL中看到您将其重定向到-http://localhost:3000/post/show/:pid(请参阅最后一部分)。或者换句话说,不会自动替换字符串中的:pid,这与get的{​​{1}}或post方法在内部执行替换的情况不同。

您可以自己构建字符串

app

答案 1 :(得分:2)

令我惊讶的是,您所取得的成就无误。该错误表明,渲染“ / post / show /:id”路由时,您无法成功检索post对象。根据您的代码段,您似乎没有在重定向URL中传递正确的帖子ID。

您可以通过几种方式(例如req.body.post_idpost.pidreq.params.id)来引用您的帖子ID,但是您使用的是pid

res.redirect('/post/show/' + pid);

pid未定义。尝试将更新代码更新为以下内容:

// Update post
app.post('/post/edit/:id', function(req, res){
    let post = {};
    post.pid = req.body.post_id;
    post.title = req.body.title;
    post.category = req.body.category;
    post.body = req.body.body;

    let query = {_id:req.params.id}

    Post.update(query, post, function(err){
        if (err) {
            console.log(err);
            return;
        } else {
            res.redirect('/post/show/' + req.params.id);
        }
    });
});

答案 2 :(得分:0)

您的代码没有/post/show/:pid的处理程序,或者您没有显示完整的代码。这意味着更新完成后,您需要再次返回编辑页面。如果是这种情况,则需要从以下位置更改代码行

res.redirect('/post/show/:pid');

res.redirect('/post/edit/' + pid);