Javascipt和Node.js处理错误(然后/捕获)
假设我在routes.js文件中有此伪代码:
var pkg = require('random-package');
app.post('/aroute', function(req, res) {
pkg.impl_func(data, function (err, result) {
myFunction(entity).then(user=>{
//DO_STUFF_HERE
res.render('page.ejs');
}).catch(err => {
console.log(err);
res.render('error.ejs');
});
});
});
function myFunction(username) {
//.....
}
我使用的pkg是在npmjs网站上找到的。 myFunction()
始终是我的职责。
在我的代码中,您可以看到当myFunction()
失败时,我已经实现了then / catch语句。因此,发生这种情况时,会渲染error.ejs
。
但是当npm软件包失败时会发生什么?在终端中,我收到错误消息,但是服务器端没有错误处理。这意味着,当失败时,不会以error.ejs
通知用户,这很明显,因为我的代码中省略了此功能。
但是当pkg失败时,呈现error.ejs
的方法是什么?
由于我已经在下面使用.then()/.catch()
技术,因此我也可以在上面使用吗?换句话说,我可以嵌套.then()/.catch()
语句吗?我可以将外部代码括到try/catch
内(同时仍然有try/catch
吗?)
pkg.impl_func()
似乎是在实现典型的Node.js回调接口(即,如果发生错误,则返回错误作为第一个参数,如果没有错误,则返回null
)。您可以简单地检查是否存在错误,并在出现error.ejs
时进行渲染:
app.post('/aroute', function(req, res) {
pkg.impl_func(data, function (err, result) {
if (err) {
res.render('error.ejs');
} else {
myFunction(entity).then(user=>{
//DO_STUFF_HERE
res.render('page.ejs');
}).catch(err => {
console.log(err);
res.render('error.ejs');
});
}
});
});
或者,您可以使用util.promisify()
将util.promisify()
转换为异步功能。然后,您可以在pkg.impl_func()
函数中使用promise.catch()
或try-catch
简化语法:
async