Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未处理的PromisejectionWarning:节点js中的映射中未处理的承诺拒绝_Javascript_Node.js_Express_Unhandled Exception - Fatal编程技术网

Javascript 未处理的PromisejectionWarning:节点js中的映射中未处理的承诺拒绝

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(…)调用搜索

我总是在运行下面的代码块时出错- 未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志
--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);
    }));