如何返回202 Accepted,然后在Nest.js中继续处理请求



我需要一个控制器操作:

  1. 授权呼叫
  2. 验证它
  3. 返回202接受状态
  4. 继续处理请求
  5. 使用以前接受的和现在处理的请求的结果对外部API进行调用

前两点很简单,我先用AuthGuard,然后用class-validator。但我不知道如何返回HTTP响应,然后继续处理。

由于请求由一组(可能是长时间运行的(任务组成,我考虑使用拦截器,该拦截器使用RxJS来观察任务的状态,并在任务完成时调用外部PI。然而,我没有使用RxJS或拦截器的经验(不是这样(,所以我真的不知道如何让拦截器的进程运行,而是立即将控制权交给控制器的操作。

此外,也许还有另一种更好的方法?没有拦截器,只是把所有的流逻辑都放在控制器里?其他选择?

我希望您有一个服务,它可以进行外部API调用(异步(并返回PromiseObservable:

@Injectable()
export class ExternalApiService {
constructor(private readonly httpService: HttpService) {}
makeApiCall(data): Observable<AxiosResponse<any>> {
return this.httpService.post('https://external.api', data);
}
}

我还假设有一个预处理器服务进行异步调用(例如从数据库获取用户信息(。

控制器

@Post()
@UseGuards(AuthGuard('jwt'))
@HttpCode(HttpStatus.ACCEPTED)
async post(@Body(new ValidationPipe()) myDataDto: MyDataDto) {
// The preprocessing might throw an exception, so we need to wait for the result
const preprocessedData = await this.preprocessService.preprocess(myDataDto);
^^^^^
// We do not need the result to respond to the request, so no await
this.externalApiService.makeApiCall(preprocessedData);
return 'Your data is being processed.';
}

当您进行异步调用时,只有通过使用async/await或返回Promise/Observable明确告知控制器方法执行,控制器方法的执行才会等待。

在本例中,我们希望在发送响应之前等待this.preprocessService.preprocess(myDataDto)的结果。我们通过使用await(该方法必须声明为async(来实现这一点。

我们想向外部API发出请求,但我们的响应不需要结果。因为我们在这里没有使用await,所以它将进行http调用并立即执行下一行(返回语句(,而无需等待结果。

如果您的服务返回承诺,您可以执行以下操作,则在处理继续的同时,API将返回202。当然,任何使用"then"的处理都是在"beginProcessing"完成之后进行的。

@Post()
@HttpCode(HttpStatus.ACCEPTED)
beginProcessing(@Req() request, @Body() data: Data): void {
this.service.process(data).then(...);
}

相关内容

  • 没有找到相关文章

最新更新