Expressjs:处理来自数据库操作的错误(下一步未定义)

时间:2017-12-16 23:05:28

标签: node.js express error-handling mongoose-schema

我正在尝试开发一个流模式来处理尝试执行数据库操作时遇到的错误。我有点失落,但我想我已经非常接近搞清楚了。这是我一直试图模仿的例子: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');
    });

});

&#34;下一个&#34;未定义。我不完全了解如何使用它,我不确定是否应该使用它。

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

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

修改

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;
        });
    });
}

1 个答案:

答案 0 :(得分:0)

当您致电next时,您想要致电的是cb。所以重命名其中之一。此外,如果发生错误,您不应该只调用next,而且如果您的操作成功,也不应该调用import telnetlib doReadWrite(tn, wrt, rd): if wrt is not None: tn.write(wrt) if rd is not None: return tn.read_until(rd) ip_list = [list of IP addresses] for ip in ip_list: server = telnetlib.Telnet(ip) doReadWrite(server, None, b'login: ') doReadWrite(server, username+b'\r\n', b'Password: ') doReadWrite(server, password+b'\r\n', b'$') doReadWrite(server, b'su\r\n', b'Password: ') doReadWrite(server, root_pass+b'\r\n', b'#') doReadWrite(server, b'/sbin/halt\r\n', None) server.close() 。否则,永远不会调用您的重定向。

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