Deno의 기본 HTTP 서버, Deno Deploy, Node.js 16.5 이상, Cloudflare Workers 및 Bun의 미들웨어 프레임 워크. 또한 미들웨어 라우터도 포함되어 있습니다.
이 미들웨어 프레임 워크는 @koa/router에서 영감을 얻은 KOA 및 미들웨어 라우터에서 영감을 얻었습니다.
이 readme은 오크 API의 역학에 중점을두고 있으며 Express 및 KOA와 같은 JavaScript 미들웨어 프레임 워크와 Deno에 대한 괜찮은 이해에 익숙한 사람들을위한 것입니다. 이것에 익숙하지 않으면 Oakserver.github.io/oak에서 문서를 확인하십시오.
또한 FAQ와 멋진 커뮤니티 리소스 사이트를 확인하십시오.
메모
이 readme의 예제는 main 에서 끌어 당겨서 Deno Cli 또는 Deno Deploy 용으로 설계되었으며 실제로 워크로드를 배포하려는 경우에는 의미가 없습니다. 사용중인 Deno 버전과 호환되는 특정 버전으로 "PIN"을 원하고 예상 할 수있는 고정 된 API 세트가 있습니다. https://deno.land/x/ URL에서 GIT 태그를 사용하여 특정 버전으로 귀하를 지시합니다. 따라서 Oak의 버전 13.0.0을 사용하려면 https://deno.land/x/[email protected]/mod.ts 가져 오려고합니다.
오크는 Deno.land/X 및 JSR 모두에서 구입할 수 있습니다. deno.land/x 에서 사용하려면 모듈로 가져 오기 :
import { Application } from "https://deno.land/x/oak/mod.ts" ;JSR에서 사용하려면 모듈로 가져옵니다.
import { Application } from "jsr:@oak/oak@14" ;NPM과 JSR 모두에서 OAK는 Node.js에 사용할 수 있습니다. NPM에서 사용하려면 패키지를 설치하십시오.
npm i @oakserver/oak@14
그런 다음 모듈로 가져옵니다.
import { Application } from "@oakserver/oak" ;JSR에서 사용하려면 패키지를 설치하십시오.
npx jsr i @oak/oak@14
그런 다음 모듈로 가져옵니다.
import { Application } from "@oak/oak/application" ; 메모
TLS/HTTPS를 통해 WebSocket 업그레이드를 보내고 Send, Serving은 현재 지원되지 않습니다.
또한 CloudFlare Worker 환경 및 실행 컨텍스트는 현재 미들웨어에 노출되지 않습니다.
JSR의 CloudFlare Workers는 오크를 사용할 수 있습니다. 사용하려면 CloudFlare Worker 프로젝트에 패키지를 추가하십시오.
npx jsr add @oak/oak@14
그런 다음 모듈로 가져옵니다.
import { Application } from "@oak/oak/application" ;다른 런타임과 달리 OAK 응용 프로그램은 들어오는 요청을 듣지 않고 대신 작업자 페치 요청을 처리합니다. 최소한의 예제 서버는 다음과 같습니다.
import { Application } from "@oak/oak/application" ;
const app = new Application ( ) ;
app . use ( ( ctx ) => {
ctx . response . body = "Hello CFW!" ;
} ) ;
export default { fetch : app . fetch } ; 메모
Send and WebSocket 업그레이드는 현재 지원되지 않습니다.
JSR의 BUN에 참나무를 사용할 수 있습니다. 패키지 설치를 사용하려면 :
bunx jsr i @oak/oak@14
그런 다음 모듈로 가져옵니다.
import { Application } from "@oak/oak/application" ; 메모
Send and WebSocket 업그레이드는 현재 지원되지 않습니다.
Application 클래스는 HTTP 서버 관리, 미들웨어 실행 및 요청을 처리 할 때 발생하는 오류를 처리하는 조정을 조정합니다. 두 가지 방법은 일반적으로 사용됩니다 : .use() 및 .listen() . 미들웨어는 .use() 메소드를 통해 추가되며 .listen() 메소드는 서버를 시작하고 등록 된 미들웨어로 요청을 시작합니다.
Hello World와의 모든 요청에 응답하는 기본 사용! :
import { Application } from "jsr:@oak/oak/application" ;
const app = new Application ( ) ;
app . use ( ( ctx ) => {
ctx . response . body = "Hello World!" ;
} ) ;
await app . listen ( { port : 8000 } ) ;그런 다음이 스크립트를 Deno에서 다음과 같이 실행합니다.
> deno run --allow-net helloWorld.ts
Deno에서 코드 실행 또는 DeNo CLI 설치 방법에 대한 정보에 대한 자세한 내용은 Deno Manual을 확인하십시오.
미들웨어는 각 미들웨어 기능이 응답의 흐름을 제어 할 수있는 스택으로 처리됩니다. 미들웨어가 호출되면 스택의 "다음"메소드에 대한 컨텍스트와 참조가 전달됩니다.
더 복잡한 예 :
import { Application } from "jsr:@oak/oak/application" ;
const app = new Application ( ) ;
// Logger
app . use ( async ( ctx , next ) => {
await next ( ) ;
const rt = ctx . response . headers . get ( "X-Response-Time" ) ;
console . log ( ` ${ ctx . request . method } ${ ctx . request . url } - ${ rt } ` ) ;
} ) ;
// Timing
app . use ( async ( ctx , next ) => {
const start = Date . now ( ) ;
await next ( ) ;
const ms = Date . now ( ) - start ;
ctx . response . headers . set ( "X-Response-Time" , ` ${ ms } ms` ) ;
} ) ;
// Hello World!
app . use ( ( ctx ) => {
ctx . response . body = "Hello World!" ;
} ) ;
await app . listen ( { port : 8000 } ) ; HTTPS 서버를 제공하려면 app.listen() 옵션에는 옵션 .secure 옵션이 true 로 설정하고 .certFile 및 .certfile 및 .keyFile 옵션도 포함해야합니다.
.handle() 메소드 .handle() 메소드는 응용 프로그램이 서버 측면을 관리하지 않고 요청을 처리하고 응답을 수신하는 데 사용됩니다. 이것은 고급 사용량이지만 대부분의 사용자는 .listen() 사용하기를 원합니다.
.handle() 메소드는 최대 세 개의 인수를 허용합니다. 첫 번째는 Request 주장이고, 두 번째는 Deno.Conn 주장입니다. 세 번째 선택적 인수는 TLS 연결에서 원격 클라이언트와의 요청이 "보안"인지를 나타내는 플래그입니다. 이 메소드는 Response 객체로 해결되었거나 ctx.respond === true 인 경우 undefined .
An example:
import { Application } from "jsr:@oak/oak/application" ;
const app = new Application ( ) ;
app . use ( ( ctx ) => {
ctx . response . body = "Hello World!" ;
} ) ;
const listener = Deno . listen ( { hostname : "localhost" , port : 8000 } ) ;
for await ( const conn of listener ) {
( async ( ) => {
const requests = Deno . serveHttp ( conn ) ;
for await ( const { request , respondWith } of requests ) {
const response = await app . handle ( request , conn ) ;
if ( response ) {
respondWith ( response ) ;
}
}
} ) ;
}응용 프로그램 인스턴스에는 몇 가지 속성이 있습니다.
contextState 새로운 컨텍스트에 대한 상태를 작성하는 데 사용되는 메소드를 결정합니다. "clone" 의 값은 상태를 앱 상태의 클론으로 설정합니다. "prototype" 의 값은 앱 상태가 컨텍스트 상태의 프로토 타입으로 사용됨을 의미합니다. "alias" 의 값은 응용 프로그램의 상태와 컨텍스트의 상태가 동일한 객체에 대한 참조임을 의미합니다. "empty" 의 값은 컨텍스트의 상태를 빈 개체로 초기화합니다.
.jsonBodyReplacer 응답을 형성 할 때 JSON 본체에 적용되는 선택적 대체 기능 기능.
.jsonBodyReviver 요청에서 JSON 본체를 읽을 때 적용되는 선택적 재생 함수.
.keys
쿠키에 서명하고 확인할 때 사용할 키. 값은 키 배열 및 KeyStack 인스턴스 또는 KeyStack 과 동일한 인터페이스 (예 : KeyGrip의 인스턴스)로 설정할 수 있습니다. 키 만 전달되면 Oak는 KeyStack 통해 키를 관리하여 데이터 값을 다시 서명 할 필요없이 쉽게 키 회전 할 수 있습니다.
.proxy
이 기본값은 false 로 표시되지만 Application 생성자 옵션을 통해 설정할 수 있습니다. 이는 응용 프로그램이 프록시 뒤에 있음을 나타내며 요청을 처리 할 때 X-Forwarded-Proto , X-Forwarded-Host 및 X-Forwarded-For 사용하여 요청에 대한보다 정확한 정보를 제공해야합니다.
.state
Application() 구성 할 때 일반적인 인수를 지정하여 강력하게 입력하거나 상태 개체 (예 : Application({ state }) )을 전달하여 추론 할 수있는 응용 프로그램 상태의 기록.
미들웨어로 전달 된 컨텍스트에는 몇 가지 속성이 있습니다.
.app
이 미들웨어를 호출하는 Application 에 대한 참조.
.cookies
쿠키를 읽고 설정할 수있는 이러한 맥락의 Cookies 인스턴스.
.request
요청에 대한 세부 정보가 포함 된 Request 객체.
.respond
미들웨어가 처리가 완료되면 응용 프로그램이 .response 를 클라이언트에 보내야하는지 결정합니다. true 이라면 응답이 전송되고 false 경우 응답이 전송되지 않습니다. 기본값은 true 이지만 .upgrade() 및 .sendEvents() 와 같은 특정 메소드는 이것을 false 로 설정합니다.
.response
요청자에게 다시 전송 된 응답을 형성하는 데 사용되는 Response 객체.
.socket
연결이 웹 소켓으로 업그레이드되지 않은 경우 undefined 되지 않습니다. 연결이 업그레이드되면 .socket 인터페이스가 설정됩니다.
.state
Application() 구성 할 때 일반적인 인수를 지정하여 강력하게 입력하거나 상태 개체 (예 : Application({ state }) )을 전달하여 추론 할 수있는 응용 프로그램 상태의 기록.
미들웨어로 전달 된 컨텍스트에는 몇 가지 방법이 있습니다.
.assert()
사실이 아니라면 HTTPError 를 던지는 주장을 제시합니다. httperror는 두 번째 인수로 서브 클래스가 식별되는 메시지가 세 번째 인수입니다.
.send()
파일을 요청하는 클라이언트로 스트리밍하십시오. 자세한 내용은 아래 정적 내용을 참조하십시오.
.sendEvents()
현재 연결을 서버에 대한 이벤트 응답으로 변환하고 메시지 및 이벤트를 클라이언트에게 스트리밍 할 수있는 ServerSentEventTarget 타겟을 반환합니다. 이것은 false 에 .respond 합니다.
.throw()
서브 클래스가 첫 번째 인수로 식별되는 HTTPError 던지고, 메시지는 두 번째로 전달됩니다.
.upgrade()
웹 소켓 연결에 연결을 업그레이드하고 WebSocket 인터페이스를 반환하십시오. 이전 버전의 Oak, 이것은 std/ws 웹 소켓으로 해결하는 Promise 입니다.
다른 미들웨어 프레임 워크와 달리 context 상당한 양의 별칭이 없습니다. 요청에 대한 정보는 .request 에만 위치하고 응답에 대한 정보는 .response 에만 있습니다.
context.cookies 통해 요청에서 쿠키 값에 액세스 할 수 있으며 응답으로 쿠키를 설정할 수 있습니다. .keys 속성이 응용 프로그램에 설정된 경우 쿠키를 자동으로 보호합니다. .cookies Web Crypto API를 사용하여 쿠키에 서명하고 검증하기 때문에 API는 비동기 방식으로 작동하기 때문에 쿠키 API는 비동기 방식으로 작동합니다. 몇 가지 방법이 있습니다.
.get(key: string, options?: CookieGetOptions): Promise<string | undefined>
요청에서 쿠키를 검색하려고 시도하고 키를 기반으로 쿠키 값을 반환합니다. 응용 프로그램 .keys 가 설정된 경우 쿠키는 서명 된 쿠키 버전에 대해 확인됩니다. 쿠키가 유효하면 약속이 값으로 해결됩니다. 유효하지 않은 경우 쿠키 서명이 응답에서 삭제되도록 설정됩니다. 쿠키가 현재 키에 의해 서명되지 않은 경우 사임하고 응답에 추가됩니다.
.set(key: string, value: string, options?: CookieSetDeleteOptions): Promise<void>
제공된 키, 값 및 모든 옵션에 따라 응답으로 쿠키를 설정합니다. 응용 프로그램 .keys 가 설정되면 쿠키가 서명되고 서명이 응답에 추가됩니다. 키가 비동기로 서명되면 .set() 메소드를 기다리는 것이 좋습니다.
context.request 에는 요청에 대한 정보가 포함되어 있습니다. 몇 가지 속성이 포함되어 있습니다.
.body
요청 본문에 대한 액세스를 제공하는 객체. 요청 본문 API에 대한 자세한 내용은 아래를 참조하십시오.
.hasBody
요청에 신체가 있거나 그렇지 않은 경우 false 있을 경우 true 로 설정하십시오. 신체가 내장 된 신체 파서에 의해 지원되는지 확인하지 않습니다.
[! 경고] 이것은 신뢰할 수없는 API입니다. HTTP/2에서 많은 상황에서 HTTP/2의 스트리밍 특성으로 인해 신체를 읽으려고 시도하지 않는 한 요청에 신체가 있는지 여부를 판단 할 수 없습니다. Deno 1.16.1 현재 HTTP/1.1의 경우 Deno는 또한 그 행동을 반영합니다. 요청에 신체가 있는지 여부를 결정하는 유일한 신뢰할 수있는 방법은 신체를 읽으려고 시도하는 것입니다.
신체가 주어진 방법으로 당신에게 의미가 있는지 확인한 다음 주어진 맥락에서 의미가있는 경우 신체를 읽고 처리하려고 시도하는 것이 가장 좋습니다. 예를 들어 GET and HEAD 신체가 없어야하지만 DELETE 및 OPTIONS 과 같은 방법에는 신체가있을 수 있으며 응용 프로그램에 의미가있는 경우 신체를 조건부로 처리해야합니다.
.headers
요청의 헤더, Headers 인스턴스.
.method
요청에 대한 HTTP 메소드를 나타내는 문자열.
.originalRequest
더 이상 사용되지 않는 Oak의 향후 릴리스에서 제거 될 것입니다.
DOM Request 오브젝트에 대한 추상화 인 "RAW" NativeServer 요청. .originalRequest.request 는 처리중인 DOM Request 인스턴스입니다. 사용자는 일반적으로 이것을 사용하지 않아야합니다.
.secure
.protocol 의 바로 가기, https가 그렇지 false true 반환합니다.
.source
Deno에서 실행할 때 .source 소스 웹 표준 Request 으로 설정됩니다. nodejs에서 실행될 때는 정의되지 undefined .
.url
요청에 대한 전체 URL을 기반으로하는 URL 인스턴스. 이것은 요청 대상의 나머지 부분에 URL의 일부를 노출시키는 대신에 있습니다.
그리고 몇 가지 방법 :
.accepts(...types: string[])
응답 요청에 의해 지원되는 컨텐츠 유형을 협상합니다. 콘텐츠 유형이 전달되지 않으면 메소드는 승인 된 컨텐츠 유형의 우선 순위 배열을 반환합니다. 콘텐츠 유형이 전달되면 최상의 협상 된 컨텐츠 유형이 반환됩니다. 컨텐츠 유형이 일치하지 않으면 undefined 일치가 반환됩니다.
.acceptsEncodings(...encodings: string[])
응답 요청에 의해 지원되는 컨텐츠 인코딩을 협상합니다. 인코딩이 전달되지 않으면 메소드는 허용 된 인코딩의 우선 순위 배열을 반환합니다. 인코딩이 통과되면 최상의 협상 인코딩이 반환됩니다. 인코딩이 일치하지 않으면 undefined 일치가 반환됩니다.
.acceptsLanguages(...languages: string[])
고객이 이해할 수있는 언어를 협상합니다. 로케일 변형이 선호하는 곳. 인코딩이 전달되지 않으면이 메소드는 우선 순위가 이해 된 언어 배열을 반환합니다. 언어가 통과되면 최상의 협상 언어가 반환됩니다. 일치하는 언어 일치 undefined 않은 경우 반환됩니다.
중요한
이 API는 오크 v13 이상에서 크게 바뀌 었습니다. 이전 API는 2018 년에 Oak이 만들어진 이후 유기적으로 성장했으며 다른 일반적인 API를 대표하지 않았습니다. V13에 도입 된 API는 Fetch API의 신체를 다루는 Request 방법에 더 잘 맞으며, 처음으로 Oak에 오는 개발자에게 더 친숙해야합니다.
OAK 요청에 대한 API는 .body 가 Fetch API의 Request 에서 영감을 받았지만 일부 추가 기능이 있습니다. 컨텍스트의 request.body Body는 여러 속성을 제공하는 객체의 인스턴스입니다.
.has
요청에 신체가 있거나 그렇지 않은 경우 false 있을 경우 true 로 설정하십시오. 신체가 내장 된 신체 파서에 의해 지원되는지 확인하지 않습니다.
[! 중요] 이것은 신뢰할 수없는 API입니다. HTTP/2에서 많은 상황에서 HTTP/2의 스트리밍 특성으로 인해 신체를 읽으려고 시도하지 않는 한 요청에 신체가 있는지 여부를 판단 할 수 없습니다. Deno 1.16.1 현재 HTTP/1.1의 경우 Deno는 또한 그 행동을 반영합니다. 요청에 신체가 있는지 여부를 결정하는 유일한 신뢰할 수있는 방법은 신체를 읽으려고 시도하는 것입니다.
신체가 주어진 방법으로 당신에게 의미가 있는지 확인한 다음 주어진 맥락에서 의미가있는 경우 신체를 읽고 처리하려고 시도하는 것이 가장 좋습니다. 예를 들어 GET and HEAD 신체가 없어야하지만 DELETE 및 OPTIONS 과 같은 방법에는 신체가있을 수 있으며 응용 프로그램에 의미가있는 경우 신체를 조건부로 처리해야합니다.
.stream
Uint8Array 덩어리에서 신체를 읽을 수있는 ReadableStream<Uint8Array> . 이것은 페치 API Request 에서 .body 속성과 비슷합니다.
.used
신체가 사용 된 경우 true 로 설정하십시오. 그렇지 않으면 false 로 설정하십시오.
또한 몇 가지 방법이 있습니다.
arrayBuffer()
신체의 내용물이 포함 된 ArrayBuffer 로 해결됩니다. 이진 데이터를 읽고/처리하는 데 적합합니다.
blob()
신체의 내용물이 들어있는 Blob 해결됩니다. 이진 데이터를 읽고/처리하는 데 적합합니다.
form()
신체의 내용물에서 디코딩 된 URLSearchParams 로 해결됩니다. 이것은 콘텐츠 유형의 application/x-www-form-urlencoded 신체에 적합합니다.
formData()
신체의 내용물에서 디코딩 된 FormData 인스턴스로 해결됩니다. 이것은 내용 유형의 multipart/form-data 가진 신체에 적합합니다.
json()
JSON으로 구문 분석 된 본문의 데이터로 해결됩니다. 응용 프로그램에 jsonBodyReviver 가 지정된 경우 JSON을 구문 분석 할 때 사용됩니다.
text()
신체의 내용을 나타내는 줄로 해결됩니다.
type()
신체를 인코딩하는 방법에 대한 지침을 제공하려고 시도하여 신체를 해독하는 데 사용할 방법을 결정하는 데 사용할 수 있습니다. 이 메소드는 해석 된 신체 유형을 나타내는 문자열을 반환합니다.
| 값 | 설명 |
|---|---|
"binary" | 본문에는 이진 데이터를 나타내는 컨텐츠 유형이 있으며 .arrayBuffer() , .blob() 또는 .stream 사용하여 본문을 읽어야합니다. |
"form" | 본문은 형태 데이터로 인코딩되며 .form() 신체를 읽는 데 사용해야합니다. |
"form-data" | 본체는 다중 부분 형식으로 인코딩되며 .formData() 신체를 읽는 데 사용해야합니다. |
"json" | 본문은 JSON 데이터로 인코딩되며 .json() 사용하여 신체를 읽어야합니다. |
"text" | 본문은 텍스트로 인코딩되며 .text() 신체를 읽는 데 사용해야합니다. |
"unknown" | 신체가 없거나 내용 유형에 따라 신체 유형을 결정할 수 없었습니다. |
.type() 메소드는 본문의 유형을 결정할 때 사용될 맞춤형 미디어 유형의 선택적 인수를 취합니다. 그런 다음 기본 미디어 유형에 통합됩니다. 값은 키가 binary , form , form-data , json 또는 text 중 하나 인 객체이며 값은 Type-IS 형식과 호환되는 형식의 적절한 미디어 유형입니다.
context.response 에는 요청자에게 다시 전송 될 응답에 대한 정보가 포함되어 있습니다. 몇 가지 속성이 포함되어 있습니다.
.body
응답 본문은 아래에 문서화 된 자동 응답 본문 처리로 종종 처리 할 수 있습니다.
.headers
응답 용 헤더가 포함 된 Headers 인스턴스.
.status
응답으로 다시 전송 될 HTTP Status 코드. 응답하기 전에 설정되지 않은 경우, .body 있으면 OAK가 200 OK 로 기본값을받습니다. 그렇지 않으면 404 Not Found .
.type
응답을 위해 Content-Type 헤더를 설정하기위한 미디어 유형 또는 확장. 예를 들어, 신체를 설명하기 위해 txt 또는 text/plain 제공 할 수 있습니다.
그리고 몇 가지 방법 :
.redirect(url?: string | URL | REDIRECT_BACK, alt?: string | URL)
다른 URL에 대한 응답 리디렉션을 단순화하는 메소드. Location 헤더를 제공된 url 로 설정하고 상태가 302 Found 로 설정됩니다 (상태가 이미 3XX 상태가 아닌 한). url 로 Symbol REDIRECT_BACK 사용하면 요청의 Referer 헤더가 방향으로 사용되어야하며, Referer 설정되지 않은 경우 alt 대체 위치임을 나타냅니다. alt 나 Referer 설정되지 않으면 REDIRECT는 / 로 발생합니다. 기본 HTML (요청자가 지원하는 경우) 또는 텍스트 본문이 리디렉션되고 있다고 설명합니다.
.toDomResponse()
이것은 오크가 Fetch API Response 에 대한 응답에 대해 이해하는 정보를 변환합니다. 이것은 응답을 마무리하여 더 이상 던지기에 대한 응답을 수정하려고 시도합니다. 이것은 요청에 응답 할 수 있도록 참나무 내에서 내부적으로 사용하도록 의도됩니다.
.with(response: Response) 및 .with(body?: BodyInit, init?: ResponseInit)
이것은 웹 표준 Response 에 대한 응답을 설정합니다. 이를 통해 다른 미들웨어의 응답에 대한 다른 정보가 설정 될 헤더 또는 쿠키를 포함하여 다른 중간 제품의 다른 정보를 무시하고 재정의합니다.
.response 의 헤더에 응답 Content-Type 설정되지 않으면 OAK는 자동으로 적절한 Content-Type 결정하려고합니다. 먼저 .response.type 를 살펴 봅니다. 할당 된 경우 .type 의 값을 미디어 유형으로 처리하거나 확장자에 따라 미디어 유형을 해결하는 데 기반으로 적절한 미디어 유형을 해결하려고합니다. 예를 들어 .type 가 "html" 으로 설정된 경우 Content-Type "text/html" 로 설정됩니다.
.type 값으로 설정되지 않으면 OAK는 .response.body 의 값을 검사합니다. 값이 string 인 경우 OAK는 문자열이 HTML처럼 보이는지 확인합니다. 그렇다면 Content-Type text/html 로 설정됩니다. 그렇지 않으면 text/plain 으로 설정됩니다. 값이 Uint8Array , Deno.Reader 또는 null 이외의 객체 인 경우 객체는 JSON.stringify() 로 전달되고 Content-Type application/json 으로 설정됩니다.
신체의 유형이 숫자, bigint 또는 symbol이면 문자열로 강요되고 텍스트로 취급됩니다.
신체의 값이 함수 인 경우 기능은 인수없이 호출됩니다. 함수의 반환 값이 약속과 같은 경우, 이는 기다릴 것이며 해결 된 값은 위와 같이 처리됩니다. 값이 약속하지 않으면 위와 같이 처리됩니다.
응용 프로그램 메소드 .listen() 은 서버를 열고 요청을 듣기 시작하고 각 요청에 대해 등록 된 미들웨어를 처리하는 데 사용됩니다. 이 메소드는 서버가 닫히면 약속을 반환합니다.
서버가 열리면 요청 처리를 시작하기 전에 응용 프로그램은 "listen" 이벤트를 시작하여 .addEventListener() 메소드를 통해들을 수 있습니다. 예를 들어:
import { Application } from "jsr:@oak/oak/application" ;
const app = new Application ( ) ;
app . addEventListener ( "listen" , ( { hostname , port , secure } ) => {
console . log (
`Listening on: ${ secure ? "https://" : "http://" } ${
hostname ?? "localhost"
} : ${ port } ` ,
) ;
} ) ;
// register some middleware
await app . listen ( { port : 80 } ) ;응용 프로그램을 닫으려면 응용 프로그램이 중단 신호 옵션을 지원합니다. 다음은 신호를 사용하는 예입니다.
import { Application } from "jsr:@oak/oak/application" ;
const app = new Application ( ) ;
const controller = new AbortController ( ) ;
const { signal } = controller ;
// Add some middleware using `app.use()`
const listenPromise = app . listen ( { port : 8000 , signal } ) ;
// In order to close the server...
controller . abort ( ) ;
// Listen will stop listening for requests and the promise will resolve...
await listenPromise ;
// and you can do something after the close to shutdown미들웨어는 미들웨어로 다른 오류를 처리하는 데 사용될 수 있습니다. 트래핑 오류가 작동하는 동안 다른 미들웨어가 실행되기를 기다리고 있습니다. 따라서 오류에 대한 잘 관리 된 응답을 제공하는 오류를 처리하는 오류가 발생하면 다음과 같은 작동합니다.
import { Application } from "jsr:@oak/oak/application" ;
import { isHttpError } from "jsr:@oak/commons/http_errors" ;
import { Status } from "jsr:@oak/commons/status" ;
const app = new Application ( ) ;
app . use ( async ( ctx , next ) => {
try {
await next ( ) ;
} catch ( err ) {
if ( isHttpError ( err ) ) {
switch ( err . status ) {
case Status . NotFound :
// handle NotFound
break ;
default :
// handle other statuses
}
} else {
// rethrow if you can't handle the error
throw err ;
}
}
} ) ; 애플리케이션 예외는 애플리케이션에 의해 잡히지 않습니다. Application Deno의 Global EventTarget 확장하고 미들웨어 또는 응답을 보내는 데 오류가 발생하면 EventError 응용 프로그램으로 발송됩니다. 이러한 오류를 들으려면 응용 프로그램 인스턴스에 이벤트 핸들러를 추가합니다.
import { Application } from "jsr:@oak/oak/application" ;
const app = new Application ( ) ;
app . addEventListener ( "error" , ( evt ) => {
// Will log the thrown error to the console.
console . log ( evt . error ) ;
} ) ;
app . use ( ( ctx ) => {
// Will throw a 500 on every request.
ctx . throw ( 500 ) ;
} ) ;
await app . listen ( { port : 80 } ) ; Router 클래스는 요청의 경로 이름을 기반으로 라우팅을 활성화하기 위해 Application 과 함께 사용할 수있는 미들웨어를 생성합니다.
다음 예는 http://localhost:8000/book/ 책을 반환 하고 http://localhost:8000/book/1 책을 ID와 함께 반환합니다 "1" :
import { Application } from "jsr:@oak/oak/application" ;
import { Router } from "jsr:@oak/oak/router" ;
const books = new Map < string , any > ( ) ;
books . set ( "1" , {
id : "1" ,
title : "The Hound of the Baskervilles" ,
author : "Conan Doyle, Arthur" ,
} ) ;
const router = new Router ( ) ;
router
. get ( "/" , ( context ) => {
context . response . body = "Hello world!" ;
} )
. get ( "/book" , ( context ) => {
context . response . body = Array . from ( books . values ( ) ) ;
} )
. get ( "/book/:id" , ( context ) => {
if ( books . has ( context ?. params ?. id ) ) {
context . response . body = books . get ( context . params . id ) ;
}
} ) ;
const app = new Application ( ) ;
app . use ( router . routes ( ) ) ;
app . use ( router . allowedMethods ( ) ) ;
await app . listen ( { port : 8000 } ) ; 통과 된 경로는 경로-레지 렉스를 사용하여 정규 표현식으로 변환되며, 이는 패턴에서 표현 된 매개 변수가 변환되는 것을 의미합니다. path-to-regexp 고급 사용량이있어 일치하는 데 사용할 수있는 복잡한 패턴을 생성 할 수 있습니다. 고급 사용 사례가있는 경우 해당 라이브러리의 문서를 확인하십시오.
대부분의 경우, context.params 의 유형은 경로 템플릿 문자열에서 TypeScript Magic을 통해 자동으로 추론됩니다. 더 복잡한 시나리오에서는 올바른 결과를 얻지 못할 수 있습니다. 이 경우 router.get<RouteParams> RouteParams context.params 의 명시 적 유형입니다.
중첩 라우터가 지원됩니다. 다음 예는 http://localhost:8000/forums/oak/posts 및 http://localhost:8000/forums/oak/posts/nested-routers 에 응답합니다.
import { Application } from "jsr:@oak/oak/application" ;
import { Router } from "jsr:@oak/oak/router" ;
const posts = new Router ( )
. get ( "/" , ( ctx ) => {
ctx . response . body = `Forum: ${ ctx . params . forumId } ` ;
} )
. get ( "/:postId" , ( ctx ) => {
ctx . response . body =
`Forum: ${ ctx . params . forumId } , Post: ${ ctx . params . postId } ` ;
} ) ;
const forums = new Router ( ) . use (
"/forums/:forumId/posts" ,
posts . routes ( ) ,
posts . allowedMethods ( ) ,
) ;
await new Application ( ) . use ( forums . routes ( ) ) . listen ( { port : 8000 } ) ; 함수 send() 미들웨어 함수의 일부로 정적 컨텐츠를 제공하도록 설계되었습니다. 가장 간단한 사용법에서는 루트가 제공되며 함수에 제공된 요청은 요청 된 경로의 루트에 대한 로컬 파일 시스템의 파일로 충족됩니다.
기본적인 사용법은 다음과 같이 보입니다.
import { Application } from "jsr:@oak/oak/application" ;
const app = new Application ( ) ;
app . use ( async ( context , next ) => {
try {
await context . send ( {
root : ` ${ Deno . cwd ( ) } /examples/static` ,
index : "index.html" ,
} ) ;
} catch {
await next ( ) ;
}
} ) ;
await app . listen ( { port : 8000 } ) ; send() 응답에서 ETag 및 Last-Modified 헤더 제공과 같은 기능을 자동으로 지원하고 요청에서 If-None-Match 및 If-Modified-Since 헤더를 처리합니다. 이는 정적 컨텐츠를 제공 할 때 클라이언트가 캐시 된 버전의 자산에 의존 할 수 있음을 의미합니다.
send() 메소드는 정적 자산에 대한 ETag 헤더 생성을 자동으로 지원합니다. 헤더를 사용하면 클라이언트가 자산을 다시 다운로드 해야하는지 여부를 결정할 수 있지만 다른 시나리오의 ETag 를 계산하는 것이 유용 할 수 있습니다.
context.reponse.body 를 평가하고 해당 신체 유형에 대한 ETag 헤더를 생성 할 수 있는지 결정하는 미들웨어 함수가 있으며, 그렇다면 응답에서 ETag 헤더를 설정합니다. 기본 사용법은 다음과 같은 것처럼 보입니다.
import { Application } from "jsr:@oak/oak/application" ;
import { factory } from "jsr:@oak/oak/etag" ;
const app = new Application ( ) ;
app . use ( factory ( ) ) ;
// ... other middleware for the applicationDeNo STD 라이브러리의 일부인 ETAG 계산에 전달할 수있는 메모리에 읽는 것이 논리적 인 내용에 따라 주어진 컨텍스트에 대한 엔티티를 검색하는 함수도 있습니다.
import { Application } from "jsr:@oak/oak/application" ;
import { getEntity } from "jsr:@oak/oak/etag" ;
import { calculate } from "jsr:@std/http/etag" ;
const app = new Application ( ) ;
// The context.response.body has already been set...
app . use ( async ( ctx ) => {
const entity = await getEntity ( ctx ) ;
if ( entity ) {
const etag = await calculate ( entity ) ;
}
} ) ; Deno.serve() 마이그레이션을 가져 오십시오 Deno.serve() 에서 마이그레이션하거나 웹 표준 Fetch API Request 및 Response 위해 설계된 코드를 조정하는 경우 도움이 필요한 오크의 몇 가지 기능이 있습니다.
ctx.request.source Deno에서 실행될 때 Fetch API Request 으로 설정되어 원래 요청에 직접 액세스 할 수 있습니다.
ctx.response.with() 이 방법은 Fetch API Response 수락하거나 제공된 BodyInit 및 ResponseInit 에 따라 새로운 응답을 생성합니다. 이것은 또한 응답을 마무리하고 Oak .response 에 설정되었을 수있는 모든 것을 무시합니다.
middleware/serve#serve() 및 middelware/serve#route() 이 두 미들웨어 생성기는 Fetch API Request 제공하고 핸들러가 Fetch API Response 으로 해결할 것으로 예상한다는 점에서 Deno.serve() 유사하게 작동하는 코드를 조정하는 데 사용될 수 있습니다.
Application.prototype.use() 와 함께 serve() 사용하는 예 :
import { Application } from "jsr:@oak/oak/application" ;
import { serve } from "jsr:@oak/oak/serve" ;
const app = new Application ( ) ;
app . use ( serve ( ( req , ctx ) => {
console . log ( req . url ) ;
return new Response ( "Hello world!" ) ;
} ) ) ;
app . listen ( ) ; 유사한 솔루션은 컨텍스트에 매개 변수와 같은 라우터에 대한 정보가 포함 된 route() 와 함께 작동합니다.
import { Application } from "jsr:@oak/oak/application" ;
import { Router } from "jsr:@oak/oak/router" ;
import { route } from "jsr:@oak/oak/serve" ;
const app = new Application ;
const router = new Router ( ) ;
router . get ( "/books/:id" , route ( ( req , ctx ) => {
console . log ( ctx . params . id ) ;
return Response . json ( { title : "hello world" , id : ctx . params . id } ) ;
} ) ) ;
app . use ( router . routes ( ) ) ;
app . listen ( ) ; mod.ts 생성 할 수있는 오크 미들웨어 테스트를위한 일부 유틸리티가 포함 된 testing 라는 객체를 내 보냅니다. 자세한 내용은 오크로 테스트를 참조하십시오.
다른 모듈에서 직접 조정 된 여러 모듈이 있습니다. 그들은 개별 라이센스와 저작권을 보존했습니다. 직접 조정 된 모듈을 포함한 모든 모듈은 MIT 라이센스에 따라 라이센스가 부여됩니다.
모든 추가 작업은 Copyright 2018-2024 The Oak 작가입니다. 모든 권리 보유.