JSNSD 인증에 대한 연습 리포지토리 및 메모. 이 저장소에서 다음 주제를 다루고 있습니다.
Fastify Documentation에 대한 시작 가이드는 기본 서버를 만들기위한 훌륭한 리소스입니다.
빠른 프로젝트를 신속하게 생성하려면
npm init fastify
# install the dependencies
npm install
# run the dev server
npm run dev 기본 HTML 응답을 위해 브라우저의 경로 http://127.0.0.1:3000/01-basic 3000/01-Basic을 방문하십시오.
Fastify를 기존 프로젝트에 통합 :
npm init fastify -- --integrateFastify-Static을 설치하고 제공 할 특정 디렉토리를 구성하십시오.
npm install --save fastify-static app.js 에서 구성하십시오
const fastifyStatic = require ( 'fastify-static' )
/** @type import('fastify').FastifyPluginAsync */
module . exports = async function ( fastify , opts ) {
// Place here your custom code!
fastify . register ( fastifyStatic , {
root : path . join ( __dirname , 'public' ) ,
prefix : '/pub/' ,
} ) 사용자 정의 파일 및 http://127.0.0.1:3000/pub/about.html http://127.0.0.1:3000/02-static-content : /pub/ about.html에 대해서는 http://127.0.1:3000/02-static-pontent를 방문하십시오.
필요한 패키지를 설치하십시오. 시야 및 핸들 바에 대해 자세히 알아보십시오.
npm install point-of-view handlebars view 디렉토리를 만들고 앱을 구성하십시오
const pointOfView = require ( 'point-of-view' )
const handlebars = require ( 'handlebars' )
/** @type import('fastify').FastifyPluginAsync */
module . exports = async function ( fastify , opts ) {
fastify . register ( pointOfView , {
engine : { handlebars } ,
root : path . join ( __dirname , 'views' ) ,
layout : 'layout.hbs' ,
} ) 여기에 따라 경로를 구축하고 http://127.0.0.1:3000/03-render-views?name=dina 를 방문하십시오.
CRUD 작업을 허용하고 지속성을 위해 SQLITE 데이터베이스와 상호 작용할 수있는 기본 할 일 서비스.
npm install sequelize sqlite3 models 기능으로 fastify 인스턴스를 장식하는 플러그인이 추가됩니다. 대상이 될 수 있습니다.
const fp = require ( 'fastify-plugin' )
const { db } = require ( '../db' )
// initialize models
const makeTodoModel = require ( '../models/todo' )
const Todo = makeTodoModel ( db )
module . exports = fp ( async function ( fastify , opts ) {
fastify . decorate ( 'models' , function ( ) {
return { db , Todo }
} )
} )이제 경로에서 함수를 사용할 수 있습니다
module . exports = async ( fastify , opts ) => {
const { Todo } = fastify . models ( )
fastify . get ( '/' , async ( request , reply ) => {
try {
const todos = await Todo . findAll ( )
return todos . map ( ( t ) => t . toJSON ( ) )
} catch ( error ) {
throw error
}
} ) 이를 위해 우리는 주요 응용 프로그램에서 Rick과 Morty API를 소비하고 있습니다.
HTTP 클라이언트 got 응용 프로그램에서 사용하기 쉽도록 설치됩니다.
npm i got
# define following env variables that will be used by the service.
# injecting variables this way is normal for consuming from dynamic dependent
# services
export CHARACTER_SERVICE=https://rickandmortyapi.com/api/character
export LOCATION_SERVICE=https://rickandmortyapi.com/api/location
파일 ./aggregate-test.http 를 사용하여 API를 테스트하십시오.
필요한 패키지를 설치하십시오
npm install fastify-reply-from fastify-http-proxy단일 경로 : 다중 출신 프록시
플러그인을 등록하고 쿼리 매개 변수를 통해 전달 된 URL의 응답을 반환 할 경로를 정의하십시오. 플러그인 fastify-reply-from URL을 수락하는 기능 from reply 객체를 장식합니다.
fastify . get ( '/' , async function ( request , reply ) {
const { url } = request . query
try {
new URL ( url )
} catch ( err ) {
throw fastify . httpErrors . badRequest ( )
}
return reply . from ( url )
} ) URL을 방문하십시오 : http://127.0.0.1:3000/06-proxy/?url=https://github.com/fastify 를 방문하십시오
HTTP 프록시 사용 : 단일 오리핀, 멀티 루트 프록시
아래 플러그인을 등록하고 구성 객체를 전달하십시오. 아래 예제의 프록시는 /rickandmorty 에 장착됩니다.
fastify . register ( require ( 'fastify-http-proxy' ) , {
upstream : 'https://rickandmortyapi.com/api/episode' ,
prefix : '/rickandmorty' ,
} ) http://127.0.0.1:3000/rickandmorty/3 3000/rickandmorty/3을 방문하십시오. 이는 이제 https://rickandmortyapi.com/api/episode/3 의 프록시입니다
매개 변수 오염 : 이름이 동일한 여러 HTTP 매개 변수를 제공하면 응용 프로그램이 예상치 못한 방식으로 값을 해석 할 수 있습니다. 이러한 효과를 악용함으로써 공격자는 입력 유효성 검사를 우회하거나 응용 프로그램 오류를 트리거하거나 내부 변수 값을 수정할 수 있습니다. HTTP 매개 변수 오염 (짧은 HPP)은 모든 웹 기술의 빌딩 블록에 영향을 미칩니다. 서버 및 클라이언트 측 공격이 존재합니다.
첫 번째 경로 /nameType 에서 우리는 쿼리 문자열 오염의 3 건을 처리했습니다.
name Is String)name Is Array)name 없음)JSON 스키마를 사용하여 들어오는 요청을 검증하도록 Fastify에게 말하는 것이 더 쉽습니다. 스키마와 함께 옵션 객체를 추가하십시오
{
schema : {
params : {
id : { type : 'number' } ,
} ,
body : {
type : 'object' ,
required : [ 'name' ] ,
additionalProperties : false ,
properties : {
name : { type : 'string' } ,
} ,
} ,
} ,
} , 우리는 유효성 검사가 두 번째 경로 /withValidation 입니다
name 없음, 불량 요청)name 배열 또는 문자열이 될 수 있음) additionalProperties: false 핸들러로 전달되는 불필요한 속성을 제거 할 수 있습니다.
응답을 위해 검증을 적용 할 수도 있습니다. 스키마에서 언급 된 속성 만 노출됩니다. 응답이 스키마 오류를 준수하지 않으면 발생합니다.
{
schema : {
response : {
201 : {
posted : { type : 'boolean' } ,
hello : { type : 'string' } ,
} ,
} ,
} ,
} ,유창한 스키질은 또한 이러한 스키마를 정의하는 데 사용될 수 있습니다.
거의 안전하지만 누군가 나 일부 봇이 무작위 요청 (DOS)으로 우리를 폭격하고 시스템이 속도를 늦추거나 서비스를 긁어 내고 있다고 가정 해 봅시다. 그들의 삶을 조금 더 어렵게 만들기 위해, 우리는 서버에서 그들의 IP를 차단할 수 있습니다. 우리가 어떻게 그렇게 빨리 할 수 있는지 살펴 보겠습니다.
플러그인을 만들고 Fastify 후크를 사용하여이를 달성 할 수 있습니다.
fastify . addHook ( 'onRequest' , async function ( request , reply ) {
if ( request . ip === '127.0.0.1' ) {
return reply . forbidden ( )
}
} ) Magic은 Swagger (OpenApi V2) 또는 OpenApi V3 스키마를 경로 스키마에서 자동으로 생성하는 Fastify-Swagger 플러그인에 의해 수행됩니다. 플러그인을 등록하면 작동합니다.
fastify . register ( require ( 'fastify-swagger' ) , {
routePrefix : '/doc' ,
exposeRoute : true ,
openapi : {
openapi : '3.0.3' ,
info : {
title : 'JSNSD' ,
description : 'Testing the Fastify swagger API' ,
version : '0.1.0' ,
} ,
externalDocs : {
url : 'https://swagger.io' ,
description : 'Find more info here' ,
} ,
} ,
} ) 핵심 및 커뮤니티 플러그인 목록은 여기에서 찾을 수 있습니다. 이 프로젝트에는 다음 플러그인과 패키지가 사용되었습니다.
시작할 준비가 되셨습니까?