我是用异步/等待函数和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); 
    } 
}; 
+0

谢谢你的回答。我明白了,但是我发现它更有趣,更令人高兴的是,我看到大量的“异步”前缀,如果按照您的建议我这样做,执行时间是否有区别? –

+0

是的,有一个很大的区别,看看这篇文章:https://www.reddit.com/r/javascript/comments/5wnsbc/async_functions_performance_question/ – alexmac

+0

我看到了,我会重写我的异步代码。非常感谢。 –