我是用异步/等待函数和Mongoose处理错误的好方法吗?
问题描述:
在我的网站上,我使用了很多异步功能来处理我网站的大部分内容,例如创建文章,管理员帐户,渲染视图等。我是用异步/等待函数和Mongoose处理错误的好方法吗?
我养成了创建尽可能多的异步功能的习惯我需要在控制器内部,然后在异步执行块内执行所有这些操作,我使用try {} catch(){}来捕获任何错误。但是,我想知道是否仅在该块上使用try {} catch(){}会让我错过一些错误?
此外,我用Mongoose与本地承诺。
而且,这是做到这一点的好方法吗? 我重复这种模式,因为很多时间,所以我想知道如果我不得不改变一半的异步功能。
这里是一个控制器例如:
// getArticle {{{
/**
* Handles the view of an article
*
* @param {HTTP} request
* @param {HTTP} response
*/
getArticle: function (request, response) {
/**
* Get the article matching the given URL
*
* @async
* @returns {Promise} Promise containing the article
*/
async function getArticle() {
let url = request.params.url
return Article
.findOne({ url: url })
.populate('category', 'title')
.exec()
}
/**
* Asynchronous execution block
*
* @async
* @throws Will throw an error to the console if it catches one
*/
(async function() {
try {
let article = await getArticle()
response.render('blog/article', {
title: article.title,
article: article
})
} catch (error) {
console.log(error)
}
}())
},
预先感谢。
答
简答 - 您的解决方案是正确的。你可能在控制器中有很多异步函数,调用它们并处理错误。所有错误将在catch
块中处理。
但是,您不需要将async
添加到所有这些功能。如果您不想在该函数中使用异步调用的结果,只需返回承诺。你也可以不用将控制器的主代码封装在函数中,你可以将控制器的动作标记为异步函数,并在其中添加代码。
getArticle: async function(request, response) {
function getArticle() {
let url = request.params.url
return Article
.findOne({ url: url })
.populate('category', 'title')
.exec()
}
try {
let article = await getArticle();
response.render('blog/article', {
title: article.title,
article: article
})
} catch (error) {
console.log(error);
}
};
谢谢你的回答。我明白了,但是我发现它更有趣,更令人高兴的是,我看到大量的“异步”前缀,如果按照您的建议我这样做,执行时间是否有区别? –
是的,有一个很大的区别,看看这篇文章:https://www.reddit.com/r/javascript/comments/5wnsbc/async_functions_performance_question/ – alexmac
我看到了,我会重写我的异步代码。非常感谢。 –