2016-02-26 121 views
2

我有这样的代码使Express.js日志错误:如何在异步操作

exports.listSavedThreads = function (req, res) { 
    SavedThread.find({}).exec().then(function (data) { 
    wat.map(); 
    res.render('home/listSavedThreads'); 
    }); 
}; 

wat是不确定的变量,因此上面的代码不工作,res.render()不会被调用,但什么都没有打印到控制台,它无声无息地失败,浏览器陷入无尽的负载。

如果我做同样的未经许:正在打印到控制台和浏览器

exports.listSavedThreads = function (req, res) { 
    wat.map(); 
    res.render('home/listSavedThreads'); 
}; 

误差,像往常一样。

我已经能够打印错误的唯一方法是通过使用try/catch

exports.listSavedThreads = function (req, res) { 
    SavedThread.find({}).exec().then(function (data) { 
    try { 
     wat.map(); 
     res.render('home/listSavedThreads'); 
    } catch(e) { 
     console.log('Error: ', e); 
    } 
    }); 
}; 

然后在控制台中我看到:

Error: [ReferenceError: wat is not defined]

很显然,我不能将try/catch放到每个操作中,因为我大多需要用于开发的错误输出,所以我可以看到我的拼写错误和类似的东西。有没有办法输出所有操作的错误,甚至是异步的?

+0

您正在正确使用try/catch。如果你的设计需要你一遍又一遍地写相同的代码,你可能会考虑一个功能分解或者如果你挖掘OO,使用多态可能也会清理它。 –

+0

@NathanielJohnson,在我写的每一个异步函数中放入'try/catch'都会带来一点负担,如果我需要的只是错误日志。浏览器在承诺内打印错误就好,为什么Node不能?我认为,我的配置可能有问题,但我不确定在哪里寻找。 –

回答

1

通常,在执行不使用Promise的异步调用时,通常/最佳做法是使用error-first callbacks来确保正确处理错误时传递&。这是最常用的方法,并在像async这样的图书馆中大量使用。

由于您在代码片段中使用Promise,我将提供一种使用Promises进行错误处理的方法。使用Promise的最好理由之一是因为它们提供了很好的异常处理功能。

添加一个.catch()呼叫到您的承诺链。您的承诺中发生的任何错误将传播到最近的.catch()处理程序。 .catch()是在.then()中提供onRejected回拨函数的替代方法。

MDN Promise .catch() Docs

Bluebird.js - Why Promises?有使用承诺时的错误处理的好处的一些例子。

exports.listSavedThreads = function (req, res) { 
    SavedThread.find({}) 
    .exec() 
    .then(function (data) { 
     wat.map(); 
     res.render('home/listSavedThreads'); 
    }) 
    .catch(function(err) { 
     //handle errors 
    }); 
}; 

或者,你可以只检查是否wat仍在继续,因此处理该场景之前定义。

exports.listSavedThreads = function (req, res) { 
    SavedThread.find({}) 
    .exec() 
    .then(function (data) { 
     if(wat) { 
     wat.map(); 
     return res.render('home/listSavedThreads'); 
     } 
     else { 
     // Handle wat undefined 
     } 
    }); 
}; 
+0

感谢您的回复,但是,正如我所说的,我只需要进行开发,所以我可以节省查找拼写错误或明显的逻辑错误的时间。将'.catch()'添加到我在应用程序中所做的每一个承诺中,在节省时间方面都无济于事。我想,我可以使用类似eslint的东西,但是Node.js默认情况下不能打印承诺中出现的错误,这似乎很奇怪。浏览器可以做到这一点。 –