Github Graphql API, Apollo Angular, 네스트된 및 배포
42133 단어 dohackathongitalytics
TL;박사 01 명
이것은 긴 과정이 될 것이다. 따라서 코드에만 관심이 있다면...
슈다만 / gitalytics
🐙 🐱 📊 Gitalytics – Github 활동에 대한 간단한 개요
카탈로그
2. API with NestJS
2.1 Configuration
2.2 CORS
2.3 API Redirection
3. Apollo Angular
3.5 Services
3.5.1 Code Generation
4 Deployment
4.2 App Setup
4.2.1 Environment Variables
4.2.2 Commands
1.Github GraphQL
GitHub GraphQL API는 얻을 데이터를 유연하고 정확하게 정의할 수 있는 능력을 제공합니다.
그것은 단지 하나의 단점, 즉
https://api.github.com/graphql
만 있다.어떤 조작을 하든지 간에 단점은 변하지 않는다.GraphQL Explorer를 사용하여 실제 GitHub 데이터에 대한 조회를 실행할 수 있습니다. 이것은 브라우저의 통합 개발 환경입니다. 문서, 문법 강조 표시, 검증 오류를 포함합니다.
이 API에 액세스하려면 Personal Access Token가 필요합니다.
주로, 나는 모든 조작에 대해
user
만 조회할 것이다.2. API(NestJS 포함)
우리는 Angular nest로 NX 작업 영역을 미리 만들었기 때문에 덕분에 apps/api에 nestjs 프로젝트를 설정했습니다.
우리는api
/github
만 만들 것입니다. 이것은 https://api.github.com/graphql
의 방향을 바꾸는 데 사용됩니다.고객 프로젝트에서 직접 사용할 수도 있습니다
https://api.github.com/graphql
.그러나 Github API를 사용하려면 PAT(즉 개인 액세스 토큰)를 사용하여 액세스해야 합니다.이제 클라이언트에서 직접 사용하면 PAT가 노출될 수 있습니다.2.1 구성
노드에서js 응용 프로그램, 이것은 자주 사용하는 것입니다.env 파일은 키 값 쌍을 포함하고 키마다 특정한 값을 대표하며 환경을 대표합니다.서로 다른 환경에서 응용 프로그램을 실행하려면 정확한 환경에서 교환하기만 하면 된다.환경 파일.
우리는 nestjs configuration 준칙을 따를 것이다.
2.1.1 환경 변수
를 생성합니다.환경 파일 ar 루트:
PAT=PERSON_ACCESS_TOKEN
API_URL=https://api.github.com/graphql
PORT=3000
WHITELIST_URL=http://localhost:4200
NODE_ENV=development
변수묘사
두드리다
GitHub 개인 액세스 토큰
API_URL
GitHub GraphQL API 엔드포인트
항구.
nestjs 프로그램을 어디에서 실행하시겠습니까?
화이트 리스트
쉼표로 구분된 URL로 API 액세스 허용
NODE_ENV
어플리케이션 실행 환경
2.1.2 변수 검증
우리는 또한 이 변수들을 검증해서 어떠한 운행 시 문제도 피할 것이다.
다음 위치에서 파일을 만듭니다: apps/api/src/app/config/validation.ts:
import * as Joi from '@hapi/joi';
export const validationSchema = Joi.object({
PORT: Joi.number().required(),
PAT: Joi.string().required(),
API_URL: Joi.string().required(),
WHITELIST_URL: Joi.string().required(),
NODE_ENV: Joi.string().valid('development', 'production').required(),
});
2.1.3 구성 모듈
ConfigModule
에서 가져오고AppModule
// ...
import { ConfigModule } from '@nestjs/config';
import { validationSchema } from './config/validation';
@Module({
imports: [ConfigModule.forRoot({ validationSchema })],
// ...
})
export class AppModule {}
2.1.4 무시.환경 파일
추가를 확인합니다.환경 파일.gitignore:
.env
2.2 CORS
Dell은 위의 환경
validationSchema
에서 API 호출만 허용합니다.CORS는 우리가 이 목표를 실현하는 데 도움을 줄 수 있다.2.2.1 NestJS의 COR
엔진 덮개 아래에서 Nest는 Expresscors 패키지를 사용합니다.이 패키지는 다양한 옵션을 제공하여 사용자의 요구에 따라 맞춤형으로 제작할 수 있습니다.
메인을 수정하라고 합니다.ts 파일:
// apps/api/src/main.ts
// ...
import { ConfigService } from '@nestjs/config';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const configService = app.get(ConfigService);
const allowList = configService.get<string>('WHITELIST_URL').split(',');
const env = configService.get<string>('NODE_ENV');
app.enableCors({
origin: (origin, callback) => {
// allow requests with no origin
// (like mobile apps or curl requests)
if (!origin && env !== 'production') return callback(null, true);
if (allowList.indexOf(origin) === -1) {
const msg =
'The CORS policy for this site does not allow access from the specified Origin.';
return callback(new Error(msg), false);
}
return callback(null, true);
},
});
const globalPrefix = 'api';
// rest remains same
}
bootstrap();
2.3 API 리디렉션
WHITELIST_URL
경로에 API를 생성합니다.2.3.1 어플리케이션 컨트롤러
// apps/api/src/app/app.controller.ts
// ...
@Controller()
export class AppController {
constructor(
private readonly appService: AppService
) {}
// ...
@Post('github')
async github() {
// TODO
}
}
2.3.2 API 논리
다음은 우리가 하고 싶은 일이다.
/github
// apps/api/src/app/app.controller.ts
// ...
import { ConfigService } from '@nestjs/config';
export class AppController {
private token: string;
private api_url: string;
constructor(
// ...
private readonly configService: ConfigService
) {
this.token = this.configService.get('PAT');
this.api_url = this.configService.get<string>('API_URL');
}
//...
}
GitHub API 엔드포인트에 요청을 보내려면 PAT
가 필요합니다.Axios는 기능이 풍부한 HTTP 클라이언트 패키지로 널리 사용되고 있다.네스트는 악시오스를 감싸고 내장
API_URL
을 통해 노출시킨다.HttpService
클래스 내보내기HttpModule
- HTTP 요청을 실행하기 위해 Axios 방법을 기반으로 하는 클래스를 공개합니다.HttpModule
를 사용하려면 먼저 가져오십시오HttpService
.@Module({
imports: [HttpModule],
})
export class AppModule {}
그런 다음 일반 구조 함수를 사용하여 Http Service에 주입합니다.export class AppController {
// ...
constructor(
// ...
private httpService: HttpService
) {
// ...
}
//...
}
이제 API 함수:@Post('github')
async github(@Req() req: Request, @Res() res: Response) {
const result = await this.httpService
.post(this.api_url, req.body, {
headers: { Authorization: 'Bearer ' + this.token },
})
.toPromise();
res.status(result.status).send(result.data);
}
이렇게!NestJS API는 GitHub GraphQL에 서비스를 제공할 준비가 되어 있습니다.3. 아폴로
나는 Apollo AngularGraphQL 클라이언트로 사용한다.다음 단계는 다음과 같습니다.
3.1 설치
npm install apollo-angular @apollo/client graphql
3.2 tsconfig 변경json
HttpService
패키지는 AsyncIterable가 필요하므로 tsconfig를 확인하십시오.기지.json 포함 내용HttpModule
:{
"compilerOptions": {
// ...
"lib": [
"es2017",
"dom",
"esnext.asynciterable"
]
}
}
3.3 API URL
API URL을 다음 환경에 저장합니다.
// apps/client/src/environments/environment.ts
export const environment = {
production: false,
api_url: '/api',
};
NX는 Angular 응용 프로그램이 개발 중인 API와 대화할 수 있도록 프록시 구성을 만듭니다.그 작업 원리를 이해하려면angular을 열어 주십시오.json 및 대상 찾기
@apollo/client
:{
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "client:build",
"proxyConfig": "apps/client/proxy.conf.json"
},
"configurations": {
"production": {
"browserTarget": "client:build:production"
}
}
},
}
proxyConfig 속성을 확인하십시오.지금 에이전트를 엽니다.conf.json:
{
"/api": {
"target": "http://localhost:3333",
"secure": false
}
}
이 설정은 nx 서버가/api로 시작하는 모든 요청을 탐지 포트 3333의 프로세스로 전송할 것을 알려 줍니다.3000 포트에서 API를 실행하고 있으므로
esnext.asynciterable
로 변경합니다.다음은 prod API URL입니다.
// apps/client/src/environments/environment.prod.ts
export const environment = {
production: true,
api_url: 'https://url-to-api/api',
};
배포 API 프로젝트의 실제 URL로 교체해야 합니다serve
.3.4 GraphQL 모듈
GraphQL 모듈 만들기:
ng g m graphql --project=client
// apps/client/src/app/graphql/graphql.module.ts
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { Apollo, APOLLO_OPTIONS } from 'apollo-angular';
import { HttpLink } from 'apollo-angular/http';
import { InMemoryCache, ApolloLink } from '@apollo/client/core';
import { setContext } from '@apollo/client/link/context';
import { environment } from '../../environments/environment';
const uri = environment.api_url + '/github';
export function createApollo(httpLink: HttpLink) {
const basic = setContext((operation, context) => ({
headers: {
Accept: 'charset=utf-8',
},
}));
const link = ApolloLink.from([basic, httpLink.create({ uri })]);
const cache = new InMemoryCache();
return {
link,
cache,
};
}
@NgModule({
exports: [HttpClientModule],
providers: [
{
provide: APOLLO_OPTIONS,
useFactory: createApollo,
deps: [HttpLink],
},
],
})
export class GraphQLModule {}
가져오기http://localhost:3000
:// apps/client/src/app/app.module.ts
// ...
@NgModule({
// ...
imports: [
// ...
GraphQLModule,
],
bootstrap: [AppComponent],
})
export class AppModule {}
3.5 서비스
아폴로 Angular에는 3개의 API가 있다.
url-to-api
, app.module.ts
와 Query
.그것들 중 하나는 결과와 변수의 형상을 정의할 수 있다.유일하게 해야 할 일은 문서 속성을 설정하는 것이다.그렇습니다. 당신은 그것을 일반적인 각도로 서비스합니다.이런 방법에서GraphQL 문서는 일등 시민입니다. 예를 들어 검색을 주요 주제로 삼을 수 있습니다.너는 Query, Mutation, Subscription services에서 그것에 대한 더 많은 정보를 읽을 수 있다.
3.5.1 코드 생성
모든 정의된 조회, 돌연변이, 구독에 대해 구성 요소에서 언제든지 사용할 수 있는 강력한 종류인 Angular 서비스를 생성할 수 있는 도구가 있습니다.
3.5.1.1 GraphQL 코드 생성기
GraphQL Code Generator는 GraphQL 모드에 따라 유형 스크립트를 생성할 수 있는 CLI 도구입니다.
먼저 GraphQL 코드 빌더를 설치합니다.
npm install --save-dev @graphql-codegen/cli
다음은 apps/client/src/에 기본 검색어를 만듭니다.그림 ql:query Viewer {
viewer {
login
}
}
GraphQL 코드 빌더를 사용하면 다음 명령만 실행하면 모든 내용을 설정할 수 있습니다.npx graphql-codegen init
다음 질문에 답하십시오.$ npx graphql-codegen init
Welcome to GraphQL Code Generator!
Answer few questions and we will setup everything for you.
? What type of application are you building? Application built with Angular
? Where is your schema?: (path or url) https://raw.githubusercontent.com/octokit/graphql-schema/master/schema.graphql
? Where are your operations and fragments?: apps/client/src/.graphql
? Pick plugins: TypeScript (required by other typescript plugins),
TypeScript Operations (operations and fragments),
TypeScript Apollo Angular (typed GQL services)
? Where to write the output: apps/client/src/generated/graphql.ts
? Do you want to generate an introspection file? Yes
? How to name the config file? codegen.yml
? What script in package.json should run the codegen? generate-codegen
이러한 작업을 완료하면 다음 사항이 변경됩니다.코드건.yml는 프로젝트의 루트 디렉터리에서 생성되었습니다
Mutation
포장의 Subscription
부분에 첨가한다.jsonapps/client/src/generated/graphql.ts는 강력한 유형의 Angular 서비스로 만들어졌으며 정의된 쿼리, 변이 또는 구독에 사용됩니다
3.6 사용
이제 Github API를 사용할 때가 되었습니다.
// apps/client/src/app/home/home.component.ts
// ...
import { ViewerGQL, ViewerQuery } from '../../generated/graphql';
@Component(...)
export class HomeComponent implements OnInit {
// ..
viewer$: Observable<ViewerQuery['viewer']>;
constructor(
// ...
private viewerGQL: ViewerGQL
) {}
ngOnInit() {
this.viewer$ = this.viewerGQL.watch().valueChanges.pipe(map((result) => result.data.viewer));
// subscribe to get the data
this.viewer$.subscribe((data)=>console.log(data));
}
}
쿨, GraphQL 관련 설정을 완료했습니다.이 두 항목을 실행하고 결과를 검사할 수 있습니다.4 배포
Digital Ocean에서 API에 대한 응용 프로그램을 추가로 만들고 같은 repo를 연결합니다.프로젝트를 구축하려면 조수 스크립트가 필요합니다.
4.1 스크립트
먼저 설치npm-run-all:
npm i -D npm-run-all
다음 스크립트를 가방에 추가합니다.json:{
// ...
"scripts": {
// ...
"build:prod:client": "ng build client --prod",
"build:prod:server": "nx build api --prod",
"build:prod": "run-s build:prod:server build:prod:client",
"deploy:start:client": "serve -s dist/apps/client -l tcp://0.0.0.0:$PORT -n",
"deploy:start:server": "node dist/apps/api/main.js",
"deploy:start": "run-p deploy:start:server deploy:start:client",
},
}
4.2 어플리케이션 설정
API 및 클라이언트에 대한 응용 프로그램 설정을 나열합니다.
4.2.1 환경 변수
4.2.1.1 API
변수
가치관
두드리다
GitHub 개인 액세스 토큰.암호화로 표시
API_URL
generate-codegen
화이트 리스트scripts
NODE_ENVhttps://api.github.com/graphql
4.2.2 명령
4.2.2.1 API
-
명령하다
짓다
https://url-of-your-client
뛰어다니다production
4.2.2.2 고객
-
명령하다
짓다
npm run build:prod:server
뛰어다니다npm run deploy:start:server
5. 다음 단계
현재 나는 ng2-charts로 클라이언트와 도표에 데이터를 표시할 것이다.
보고 싶으면 계산: https://gitalytics.shhdharmen.me/
읽어주셔서 감사합니다.
즐거움 코드
🌲 🌞 😊
Reference
이 문제에 관하여(Github Graphql API, Apollo Angular, 네스트된 및 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/shhdharmen/github-graphql-api-apollo-angular-nest-and-deployment-with-do-384c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)