gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:12:17 25 4
gpt4 key购买 nike

我需要一个 Controller Action :

  1. 授权调用
  2. 验证它
  3. 返回 202 已接受状态
  4. 继续处理请求
  5. 使用先前已接受且现在已处理的请求的结果调用外部 API。

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

由于请求由一系列(可能长时间运行的)任务组成,我想到了使用拦截器,该拦截器使用 RxJS 来观察任务的状态并在任务完成时调用外部 PI。但是,我没有使用 RxJS 或拦截器(不是这种方式)的经验,所以我真的不知道如何让拦截器的进程继续运行,但立即将控制权传递给 Controller ​​的操作。

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

最佳答案

我希望您有一个执行外部 API 调用(异步)并返回 PromiseObservable 的服务:

@Injectable()
export class ExternalApiService {
constructor(private readonly httpService: HttpService) {}

makeApiCall(data): Observable<AxiosResponse<any>> {
return this.httpService.post('https://external.api', data);
}
}

我还假设有一个进行异步调用的 PreprocesserService(例如从数据库获取用户信息)。

Controller

@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/可观察

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

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

关于javascript - Nest.js中如何返回202 Accepted然后继续处理请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53205581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com