尝试处理异步代码(nodeJS,ExpressJS)中的每个异常: 这几乎是伪代码。我使用带有方法removeTokens(num,callback(err,remainingRequest))的限制器(npm limiter)模块。代码的很大一部分位于回调内部,我想在那里捕获任何错误并将其扔给处理程序,但现在回调内部的错误仍然标记为“未处理的异常”,我不明白为什么。
app.post('/', async (req, res) => {
try {
...
return getAll();
async function getAll () {
limiter.removeTokens(1, async (err, remainingRequest) => {
try {
throw new Error('THROWN')
} catch (error) {
throw error
}
})
}
} catch (error) {
console.log(error);
}
});
答案 0 :(得分:1)
您不应将async
函数传递给不期望它们的东西(除非您像捕获app.post
回调一样捕获所有错误)。而是给自己一个limiter.removeTokens
的包装,该包装返回一个承诺:
function removeTokens(limiter, id) {
return new Promise((resolve, reject) => {
limiter.removeTokens(id, (err, remainingRequest) => {
if (err) {
reject(err);
} else {
resolve(remainingRequest);
}
});
});
}
(您也可以为此查看util.promisify
。)
然后:
app.post('/', async (req, res) => {
try {
...
await getAll(); // *** Or you might just use `removeTokens(limiter, 1)` directly here
function getAll() {
return removeTokens(limiter, 1);
}
} catch (error) {
console.log(error);
}
});
此处直接使用removeTokens
:
app.post('/', async (req, res) => {
try {
...
await removeTokens(limiter, 1);
} catch (error) {
console.log(error);
}
});
答案 1 :(得分:0)
首先,请尽可能共享尽可能多的代码,这样我们就可以轻松调试问题所在。
向您提出您的问题,我认为问题是在您的try..catch
块中,您抛出的错误不是使用reject
处理错误。我在下面粘贴了一个代码块,您可以尝试让我知道它是否对您有用。请注意,语法可能不会有所不同,但是您的想法是,如果出现错误,您必须reject
Promise。
`````````limiter.removeTokens(1, async (err, remainingRequest) => {
````````````try {
```````````````throw new Error('THROWN')
````````````} catch (error) {
```````````````return Promise.reject(error) //
````````````}
`````````})
``````}
```} catch (error) {
``````console.log(error);
```}
})