Javascript 未处理的PromisejectionWarning:节点js中的映射中未处理的承诺拒绝
我总是在运行下面的代码块时出错- 未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志Javascript 未处理的PromisejectionWarning:节点js中的映射中未处理的承诺拒绝,javascript,node.js,express,unhandled-exception,Javascript,Node.js,Express,Unhandled Exception,我总是在运行下面的代码块时出错- 未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志--unhandled rejections=strict(请参阅)。(拒绝id:1) 我很确定这是因为search和add函数中的map语句,但我不知道如何摆脱它,提供相同的功能,并使try-catch块工作?有人能帮忙吗?你没有对.map(…)调用搜索
--unhandled rejections=strict
(请参阅)。(拒绝id:1)
我很确定这是因为search和add函数中的map语句,但我不知道如何摆脱它,提供相同的功能,并使try-catch块工作?有人能帮忙吗?你没有对
.map(…)
调用搜索和添加所创建的承诺做任何事情。他们只是被忽略,没有等待,并将导致警告时,被拒绝。大概你是想用Promise.all
function search_and_add(req, res, spotifyAPI, to_filter, playlist_id) {
return Promise.all(to_filter.map(async (tag) => {
// ^^^^^^^^^^^^
const song_details = await spotifyAPI.searchTracks(tag.name, { limit: 1 });
//const song_uri = song_details['body']['tracks']['items'][0]['id'];
console.log(song_details);
});
}
- 您正在使用map函数,因为您需要使用Promise.allsolited函数包装
Promise.allSettled在node js 12及更高版本中可用。
如果使用的节点数少于节点12,则需要使用Promise.all
:
allsolited()方法返回一个承诺,该承诺在所有给定承诺履行或拒绝后解析,其中包含一个对象数组,每个对象描述每个承诺的结果
它通常用于多个异步任务,这些任务彼此不依赖,无法成功完成,或者您总是希望知道每个承诺的结果
:
all()方法将一组承诺作为输入,并返回一个承诺作为输出。当输入的所有承诺都已解决且非承诺已返回时,或者如果输入iterable不包含任何承诺,则返回的承诺将得到解决。它在任何输入承诺拒绝或非承诺抛出错误时立即拒绝,并将使用此第一条拒绝消息/错误拒绝
它通常在多个异步任务相互依赖以成功完成时使用,因为它不会等待,并且会在拒绝任何输入时立即拒绝
请参阅:
对于异步等待中的错误处理:
Async Await本质上是承诺的语法糖,如果Await语句出错,它将返回一个被拒绝的承诺,而不是添加try-catch,我们可以在其中编写一个helper函数来包装我们的express路由,以处理所有被拒绝的路由承诺
const asyncMiddleware = fn =>
(req, res, next) => {
Promise.resolve(fn(req, res, next))
.catch(next);
};
然后像这样包装您的路由函数
router.get('/users/:id', asyncMiddleware(async (req, res, next) => {
/*
if there is an error thrown in getUserFromDb, asyncMiddleware
will pass it to next() and express will handle the error;
*/
const user = await getUserFromDb({ id: req.params.id })
res.json(user);
}));
注意:您也可以为此使用npm包。您没有对\u.map(…)
调用搜索和添加所创建的承诺做任何事情。大概你是想用Promise.all
吧?嗨,对不起,我是新手。你能解释一下这是怎么回事吗?@uddhavbagat你明白这是怎么回事吗?恐怕不是真的。另外,我不知道您所说的“您没有对搜索和添加中的u.map(…)调用进行回调所创建的承诺做任何事情”的确切含义?当我使用Promise.allsolited()时,如何检查try-catch块中的错误处理?它是否必须用于所有单个元素?}).catch(函数(err){console.log(err);返回err;});您可以添加。像这样捕获错误。在我调用search_和_add函数的部分,会返回什么?如果我返回err,它会返回到我调用search\u and-add的主函数吗?您需要返回song\u详细信息。&对于error return error或empty pbject.。这样您就可以得到数组中的所有内容。我现在已经编辑了答案检查
const asyncMiddleware = fn =>
(req, res, next) => {
Promise.resolve(fn(req, res, next))
.catch(next);
};
router.get('/users/:id', asyncMiddleware(async (req, res, next) => {
/*
if there is an error thrown in getUserFromDb, asyncMiddleware
will pass it to next() and express will handle the error;
*/
const user = await getUserFromDb({ id: req.params.id })
res.json(user);
}));