如何使用内置的 HttpService 在 NestJS 中发送 2 个 HTTP 请求
How to send 2 HTTP requests in NestJS with built-in HttpService
我想在调用我的 NestJS 端点之一时同时发送 2 个请求。我正在使用 Cloudant,通过端点调用,我想访问 2 个不同数据库中的 2 个不同文档并对其执行一些操作。确切地说,我想在其中一个数据库中创建一个新文档,并在另一个数据库中修改另一个已经存在的文档。
这是我的端点 controller
:
@Put()
createEntry(@Body() body: { title: string; description: string }): Observable<{ ok: boolean; id: string; rev: string }> {
return this.entriesService.createEntry(body);
}
这是我的 entriesService
:
createEntry(body: Entry): Observable<{ ok: boolean; id: string; rev: string }> {
this.userService.modifyOtherDocument(body); // I'd like to execute this here
return this.httpService.put(`${environment.cloudantBaseUrl}/entries/${uuidv4()}`, body).pipe(map((response) => response.data));
}
这个方法应该调用另一个服务中的另一个方法,调用 userService
像这样:
modifyOtherDocument(body: Entry): Observable<{ ok: boolean; id: string; rev: string }> {
return this.httpService.put(`${environment.cloudantBaseUrl}/other_db/${body.id}`, body).pipe(map((response) => response.data));
}
如果我分别调用这两种服务方法,它们都能很好地工作。但是一旦我想从 entriesService
方法调用 userService
中的另一个方法,other_db
中的文档将根本不会更新。
我应该如何让它工作?我正在使用来自 @nestjs/axios
的 NestJS 内置 HttpService
。它们的执行顺序无关紧要。
Nest 的 HttpService
使用 RxJS
中的 Observable
。它们有点像回调,但在实际观察它之前不会触发,无论是 .subscribe()
还是 lastValueFrom
方法。你可以在这里做的是像这样使用 Observable 管道,并让两个事件一个接一个地触发
createEntry(body: Entry): Observable<{ ok: boolean; id: string; rev: string }> {
return this.userService.modifyOtherDocument(body).pipe(
switchMap(() => this.httpService.put(`${environment.cloudantBaseUrl}/entries/${uuidv4()}`, body)),
map((response) => response.data))
);
}
这将使第一个 observable 解析,然后调用第二个来代替它。如果您有兴趣,learnrxjs.io 有一些学习 RxJS 的好资源
我想在调用我的 NestJS 端点之一时同时发送 2 个请求。我正在使用 Cloudant,通过端点调用,我想访问 2 个不同数据库中的 2 个不同文档并对其执行一些操作。确切地说,我想在其中一个数据库中创建一个新文档,并在另一个数据库中修改另一个已经存在的文档。
这是我的端点 controller
:
@Put()
createEntry(@Body() body: { title: string; description: string }): Observable<{ ok: boolean; id: string; rev: string }> {
return this.entriesService.createEntry(body);
}
这是我的 entriesService
:
createEntry(body: Entry): Observable<{ ok: boolean; id: string; rev: string }> {
this.userService.modifyOtherDocument(body); // I'd like to execute this here
return this.httpService.put(`${environment.cloudantBaseUrl}/entries/${uuidv4()}`, body).pipe(map((response) => response.data));
}
这个方法应该调用另一个服务中的另一个方法,调用 userService
像这样:
modifyOtherDocument(body: Entry): Observable<{ ok: boolean; id: string; rev: string }> {
return this.httpService.put(`${environment.cloudantBaseUrl}/other_db/${body.id}`, body).pipe(map((response) => response.data));
}
如果我分别调用这两种服务方法,它们都能很好地工作。但是一旦我想从 entriesService
方法调用 userService
中的另一个方法,other_db
中的文档将根本不会更新。
我应该如何让它工作?我正在使用来自 @nestjs/axios
的 NestJS 内置 HttpService
。它们的执行顺序无关紧要。
Nest 的 HttpService
使用 RxJS
中的 Observable
。它们有点像回调,但在实际观察它之前不会触发,无论是 .subscribe()
还是 lastValueFrom
方法。你可以在这里做的是像这样使用 Observable 管道,并让两个事件一个接一个地触发
createEntry(body: Entry): Observable<{ ok: boolean; id: string; rev: string }> {
return this.userService.modifyOtherDocument(body).pipe(
switchMap(() => this.httpService.put(`${environment.cloudantBaseUrl}/entries/${uuidv4()}`, body)),
map((response) => response.data))
);
}
这将使第一个 observable 解析,然后调用第二个来代替它。如果您有兴趣,learnrxjs.io 有一些学习 RxJS 的好资源