假设我在route.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
?)
答案 0 :(得分:2)
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()
将pkg.impl_func()
转换为异步函数。然后,您可以在promise.catch()
函数内使用try-catch
或async
来简化语法:
const util = require('util')
const impl_func_async = util.promisify(pkg.impl_func)
// traditional promises:
app.post('/aroute', (req, res) => {
impl_func_async(data).then(result =>
return myFunction(entity)
}).then(user => {
// DO_STUFF_HERE
res.render('page.ejs')
}).catch(e => {
// Will catch thrown errors from impl_func_async and myFunction
console.log(e)
res.render('error.ejs')
})
})
// async-await:
app.post('/aroute', async (req, res) => {
try {
const result = await impl_func_async(data)
const user = await myFunction(entity)
// DO_STUFF_HERE
res.render('page.ejs')
} catch (e) {
// Will catch thrown errors from impl_func_async and myFunction
console.log(e)
res.render('error.ejs')
}
})
答案 1 :(得分:0)
您可以使用一个简单的try/catch
来封装它们,并在该捕获中呈现error.js
。
关于嵌套try/catch
...是的。但是,在这种情况下,承诺catch()
与基本try/catch
app.post('/aroute', function(req, res) {
try {
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');
});
});
} catch (e) {
res.render('error.ejs');
}
});
});