如何修复 NestJS 中未处理的承诺拒绝警告

How to fix unhandled promise rejection warning in NestJS

我正在为我的后端 angular 项目使用 NestJS,并且我已经放置了方法。在我安装 swagger 之前 运行ning 很好,但是在我安装 swagger 之后,我收到一条警告,说未处理的承诺拒绝并且它不允许我 运行。

它工作正常如果我在控制器中评论代码所以我认为 async/await 有问题但不确定如何修复它所以如果我能得到任何帮助或建议我将不胜感激如何解决这个问题?

控制器

    @Put(':id')
    async updateHelpSubsection(@Body() newHelp: HelpSubsectionModule, @Param() params): Promise<HelpSubsectionModule> {
        try{
            let oldHelpData = await this.helpSubsectionService.getHelpSubsectionbyId(params.id)
            return this.helpSubsectionService.updateHelpSubsection(oldHelpData, newHelp);
        }catch(e) {
            console.log(e)
        }
    }

服务

    async updateHelpSection(updateHelp: HelpSectionEntity, newHelpData): Promise<HelpSectionEntity> {

        Object.keys(newHelpData).forEach((key) => {
            updateHelp[key] = newHelpData[key];
        });

        try {
            return await this.helpSectionRepo.save(updateHelp);
        } catch (err) {
            throw new HttpException({
                error: err
            }, HttpStatus.FORBIDDEN)
        }
    }

这是我收到的警告。

不太确定 @Put(:id) 是如何工作的,但 updateHelpSection return 是一个承诺,所以你必须使用 .then() 到 return 数据来处理它promise 已解决,如果 promise 被拒绝,catch() 会抛出错误。检查这个 article

请在控制器中更新:

       @Put(':id')
       async updateHelpSubsection(@Body() newHelp: HelpSectionEntity, @Param() params): Promise< HelpSectionEntity> {
           try{
               let oldHelpData = await this.helpSubsectionService.getHelpSubsectionbyId(params.id)
               return this.helpSubsectionService.updateHelpSubsection(oldHelpData, newHelp);
           }catch(e) {
               console.log(e)
           }
       }

打字稿的类型中不允许使用模块。

请将 HelpSubsectionModule 替换为 HelpSectionEntity

您看到的只是对良好做法的警告。

每个 Promise 都必须有一个方法来捕获发出请求时将产生的错误

例如:

这是承诺。

const slowAndSteady = new Promise(function(resolve, reject) {
    reject();
});

如果你这样使用async/await。

(async function() {
    await slowAndSteady();
})();

你得到 UnhandledPromiseRejectionWarning,但如果你以这种方式使用。

slowAndSteady
    .then(function(result) {
        console.log('result', result);
    })
    .catch(function(err) {
        console.log('error: ', err);
    });

警告消失。

但如果您仍然需要使用 async/await,您有两个选择。

(async () => {
  try {
    const result = await slowAndSteady();
    console.log('result', result);
  } catch(e) {
    console.log('Error caught',e);
  }
})();

(async () => {
  const result = await slowAndSteady().catch((e) => console.log('Error caught',e));
  console.log('result', result);
})();