Expressjs:DB操作处理错误(下一步未定义)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Expressjs:DB操作处理错误(下一步未定义)相关的知识,希望对你有一定的参考价值。

我正在尝试开发一个流模式来处理尝试执行数据库操作时遇到的错误。我有点失落,但我想我已经非常接近搞清楚了。这是我一直试图模仿的例子:https://codereview.stackexchange.com/questions/65199/mongoose-promise-error-handling

这是我的mongoose模式的函数:

exports.deleteAttorney = function (id, cb) {  <-- I am not using cb.  Do I need it?

    let query = {
        _id: "6a34056376bbd68eb1ccdf11"
    };

    Firm.Firm.findOne( query, "attorneys", function (err, firm) {

        if (err || !firm) {
            return next( err || new Error("deleteAttorney() could not retrieve the firm's attorneys.") );
        }

        firm.attorneys.id(id).remove();

        firm.save(function (err) {
            if (err) {
                return next(err);
            }
        });
    });
}

这是我在路由器中调用它的地方:

router.post('/delete', function(req, res) {

    Attorney.deleteAttorney(req.query._id, function(err) {
        if (err) {
            console.error(err);  <-- I intend to put some user-friendly messaging here
        }

        res.redirect('/attorneys/manage');
    });

});

“下一步”未定义。我不完全了解如何使用它,我不确定是否应该使用它。

我想要的是尝试获取数据。尝试完成后(无论是否成功),我希望如图所示的回调运行。从模型的方法中,看起来我需要将任何错误返回给回调,但我不知道如何。

如果我使用不好的方法,应该怎么做?

Edit

Josh的回答有助于证实我怀疑用cb()替换next()。这是修改后的代码。有用。这看起来像是一种好习惯吗?如果是这样,我将对所有数据库操作使用相同的模式。我不想跳到其他人,直到我解决这个问题。

exports.deleteAttorney = function (id, cb) {

    let query = {
        _id: "6a34056376bbd68eb1ccdf11"
    };

    Firm.Firm.findOne( query, "attorneys", function (err, firm) {

        if (err || !firm) {
            cb( err || new Error("deleteAttorney() could not retrieve the firm's attorneys.") );
            return;
        }

        firm.attorneys.id(id).remove();

        firm.save(function (err, firm, numAffected) {
            cb(err, firm, numAffected);
            return;
        });
    });
}
答案

当你打电话给next时,你想要打电话的是cb。所以重命名其中之一。此外,您不仅应该在发生错误时调用next,还应该在操作成功时调用article。否则,永远不会调用您的重定向。

我认为你应该花一些时间来理解回调,这是Node.js的基础,同时,看一下错误的第一个模式。也许这个qazxswpoi可以帮助你。

以上是关于Expressjs:DB操作处理错误(下一步未定义)的主要内容,如果未能解决你的问题,请参考以下文章

ExpressJS中的db.listCollections()返回错误

ExpressJS:承诺和错误处理中间件

在等待下一步之前,我可以让 Spring 步骤在第一步中提交到 db 吗?

3.WIN10安装MySql5.5最后一步未响应解决方法

「Linux」VMware安装centos7

LInux系统@安装CentOS7虚拟机