gpt4 book ai didi

node.js - 使用 NodeJS/Express 进行正确的错误处理

转载 作者:太空宇宙 更新时间:2023-11-04 00:36:00 24 4
gpt4 key购买 nike

我有一个非常基本的迁移代码,如下所示。它删除表,创建表,并用一些数据为其播种。

this.knex.schema.dropTable(this.tableName)
.catch((err) => console.log(err))
.then(() => {
this.knex.schema.createTable(this.tableName, function(table) {
table.increments("id").primary();
table.string("name");
table.integer("parent_id").unsigned().default(0);
})
.catch((err) => console.log(err))
.then(() => {
this.categories.forEach((category) => {
Category.create(category)
.catch((err) => console.log(err))
.then((category) => console.log(category.get("name") + " seeded."))
});
});
});

您可能会注意到,代码中有 3 个 .catch((err) => console.log(err)) 链。

现在我已将 Bugsnag 集成到我的应用程序中,并且我想确保正确记录 Bugsnag 上的所有异常/错误,以便我可以修复所有错误。然而,现在我所能做的就是将它们登录到控制台。更糟糕的是,我重复自己并复制每个 catch block 中的逻辑。

我正在考虑做这样的事情:

.catch((err) => ErrorHandler.add(err))

class ErrorHandler {

add(err) {
// Notify Bugsnag
// Log it to console
}

}

这又带来了另一个问题。如果我忘记添加 catch 方法怎么办...那么它仍然无法工作。

也考虑过做这样的事情:

// Change exception behaviour so whenever they are called, they raise an  `onException` event
app.listen("onException", (err) => {
// Notify Bugsnag
// Log error to console
});

这样我就可以捕获所有错误并干燥我的代码,但我不确定 Node 是否支持 Hook 异常。

对于我的情况,您会怎么做以及我应该采取什么样的方法?我想确保所有错误都正确发送到 Bugsnag。

最佳答案

首先,this.knex.schema.createTable 返回一个 Promise 吗? (如果不是,您始终可以将其转换为返回 promise )如果是这样,您可以以更简洁的方式编写此逻辑,例如:

this.knex.schema.dropTable(this.tableName)
.then((...) => {
...
return this.knex.schema.createTable(...)
})
.then((...) => {
... // do whatever you are doing with table object
return Promise.all( map and do whatever you are doing with categories)
})
.then(() => {
// log that everything went well with seeding
})
.catch((err) => {
// single catch block to handle errors from this promise chain
})

Promise.all 如果数组中的任何 Promise 被拒绝,将返回被拒绝的 Promise,如果您发现这不符合您的需求,您可以使用 Bluebird 中的 .reflect() ( Node 中原生 Promise 支持没有的东西,http://bluebirdjs.com/docs/api/reflect.html)

其次,您可以考虑使用诸如bunyan、https://github.com/trentm/node-bunyan之类的东西来代替console.log(console.error或其他)。

第三,一般来说,您始终需要保护您的应用程序免受 uncaughtException 的影响,例如

process.on('uncaughtException', (err) => {
...
})

What if I forget adding catch methods

从我的角度来看,这将是代码中的错误,您需要意识到这一点。这就像你忘记在回调中处理错误一样,例如:

doSomething((err, data) => {
// do something with data without checking against err
})

因此可能会问同样的问题,如果我忘记检查错误怎么办,简单地说,您没有处理错误。根据经验,不要只测试晴天场景,就像一切都很顺利一样。针对代码中的不同场景进行测试,包括会抛出异常的雨天场景,确保您以正确的方式处理它。

此外,您还可以从中受益,您在问题中提到了 Express。您可以注册您需要在所有路由之后定义的全局错误处理程序,例如:

app.use((err, req, res, next) => {
...
})

有了这个,您可以从任何路由通过 return next(err) 将错误传递到此处理程序(如果不需要某些特殊的错误处理逻辑,特定于特定端点),确保您可以在一个地方处理错误,例如日志错误并返回 500 以及一些消息或其他内容。 https://expressjs.com/en/guide/error-handling.html

关于node.js - 使用 NodeJS/Express 进行正确的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39018220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com