【问题标题】:DELETE Request with nodejs and Mongoose使用 nodejs 和 Mongoose 删除请求
【发布时间】:2021-01-06 19:27:20
【问题描述】:

我正在努力使用 mongoose 从我的数据库集合中删除一行。控制台说删除成功(因为我处理了错误),但是当我检查我的数据库时,该行仍然在这里。我成功添加了一个带有发布请求的成员,但我无法删除它。 我怀疑我的路由文件或我的 hbs 文件。 这是代码:

Index.js(路由部分)

app.get('/delete',(req,res) => res.render('delete', {
    title:'Member App',
}));

路由/members.js

// Delete member : DELETE
router.get("/delete", (req,res)=>{
    console.log(req.params.id);
    Member.deleteOne({ _id: req.params.id }, function(err,data) {
        if (!err) {
            console.log(data);

                console.log("member successfully deleted")
        }
        else {
                console.log("error")
        }
    });
    res.redirect("/");
});

删除.hbs

<h1 class = "text-center mb-3">{{title}}</h1>
<form action="/delete" method ="DELETE" class="mb-4">
<div class="form-group">
    <label for="Id">Id</label>
    <input type="Id" name="Id" class ="form-control">
    
</div>
    

<input type="submit" value ="Delete member" class="btn">
</form>


控制台:(似乎我的回调中的数据未定义)

Connected to mongoDB
undefined
{ n: 0, ok: 1, deletedCount: 0 }
member successfully deleted

【问题讨论】:

    标签: javascript node.js express mongoose handlebars.js


    【解决方案1】:

    您的输入类型标签错误。

    <input type="Id" name="Id" class ="form-control">
    

    输入中没有“Id”类型(参见input types values

    您没有使用正确的字段

    req.params.id
    

    已使用,但我在您的请求中没有看到任何参数。

    你只有用 ID 填充的正文,所以为了使用它,你应该调用:

    req.body.Id
    

    【讨论】:

    • 是的,你是对的,我修改了它。但是,回调仍然以“成功删除”响应,但数据库没有更新
    【解决方案2】:

    首先没有错误并不能保证删除数据库中的一条记录。所以在这种情况下更喜欢使用findOneAndRemove 方法。

    第二个res.redirect("/"); 将在记录删除完成之前调用,所以重定向应该移动到回调函数中,如:

    Member.findOneAndRemove({ _id: req.params.id }, function(err, member) {
        if (!err && member) {
            console.log(member);
            console.log("member successfully deleted")
        }
        else {
            console.log("error")
        }
        res.redirect("/");
    });
    

    【讨论】:

    • 如您所述,使用findOneAndRemove 是安全的。除了您的回答,我想说使用deleteOne 可以静默抛出错误,因为它在code 中定义。尽管有undefined 过滤器,但即使未找到回调,您也始终运行回调。
    • 谢谢@JoseVasquez。根据您的评论编辑回来
    • 好的。当使用邮递员进行删除请求时,它工作得很好。你有什么建议?
    • 添加 cosole.log(req.params) 并检查您的请求
    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2020-11-15
    • 2018-03-14
    • 1970-01-01
    • 2020-03-08
    相关资源
    最近更新 更多