首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何返回202个已接受的请求,然后在Nest.js中继续处理请求

如何返回202个已接受的请求,然后在Nest.js中继续处理请求
EN

Stack Overflow用户
提问于 2018-11-08 10:14:01
回答 2查看 4.6K关注 0票数 8

我需要一个控制器动作:

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-09 21:02:40

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

代码语言:javascript
运行
复制
@Injectable()
export class ExternalApiService {
  constructor(private readonly httpService: HttpService) {}

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

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

控制器

代码语言:javascript
运行
复制
@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调用,并立即执行下一行(返回语句),而无需等待结果。

票数 10
EN

Stack Overflow用户

发布于 2018-11-09 15:03:40

如果您的服务返回一个承诺,您可以执行如下操作,则在处理继续时,API将返回202。当然,在“beginProcessing”完成之后,任何带有“那时”的处理都会发生。

代码语言:javascript
运行
复制
@Post()
@HttpCode(HttpStatus.ACCEPTED)
beginProcessing(@Req() request, @Body() data: Data): void {
    this.service.process(data).then(...);
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53205581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档