#angular #apollo-client #zonejs
Вопрос:
Я использую Угловой Универсальный с зоной.JS и до сих пор думал, что он ждет разрешения моих вызовов API, прежде чем отправлять ответ. Как я понимаю, Зона.JS исправляет различные библиотеки, чтобы знать, когда приложение установилось и все готово.
Наше интерфейсное приложение работает в AWS Lambda, и в универсальном контексте мы выполняем другие вызовы AWS Lambda Apollo GraphQL к нашему API, используя пользовательскую ссылку.
Если я сделаю вызовы API, используя стандартный HttpClient, @angular/common/http
то Universal будет ждать… но при использовании aws-sdk с агентом https этого не происходит. Я ни за что на свете не могу понять, как исправить это с помощью Зоны.
При просмотре углового HttpClient на сервере я вижу ссылки на перенос xhr2 в зону, но не уверен, как бы я сделал то же самое с помощью https/aws: https://github.com/angular/angular/blob/master/packages/platform-server/src/http.ts#L27
import { Injectable } from '@angular/core';
import { ApolloLink, Observable } from '@apollo/client/core';
import { AuthService } from '@tma/core';
import AwsLambda from 'aws-sdk/clients/lambda';
import { print } from 'graphql';
import { Agent } from 'https';
import { first } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class ApiLinkLambda extends ApolloLink {
client = new AwsLambda({
region: process.env.AWS_REGION,
httpOptions: {
agent: new Agent({
keepAlive: true,
maxSockets: 50,
rejectUnauthorized: true,
}),
},
});
constructor(authService: AuthService) {
super(operation => {
return new Observable(observer => {
authService.token$
.pipe(first())
.toPromise()
.then(token => {
// Make lambda call
return this.client
.invoke({
FunctionName: 'example-graphqlServer',
InvocationType: 'RequestResponse',
Payload: JSON.stringify({
body: {
query: print(operation.query),
variables: operation.variables,
},
headers: {
Authorization: token,
},
httpMethod: 'POST',
path: '/graphql',
requestContext: {
requestTimeEpoch: Date.now(),
},
}),
})
.promise()
.then(result => {
const response = JSON.parse(result.Payload!.toString());
const body = JSON.parse(response.body);
observer.next(body);
observer.complete();
});
});
});
});
}
}