Deno에 서버를 구축하는 방법 2021년 11월 버전
문장을 집필할 때의 결론: std/http의 서버
일단 결론부터.현재 std/http
serve
를 사용하는 방법을 추천합니다.0.14.0시 std/http의 README에는 추가 설명이 없지만 JSDc와 Deno1.16의 발표문에는 이
serve
방법을 사용했고 최근까지 추천한listenAndServe
방법은 추천하지 않았다.견본을 만들어 보았다.
serve
의 첫 번째 파라미터는Handler: (request: Request, connInfo: ConnInfo) => Response | Promise<Response>
이고 두 번째 파라미터는ServeInit: { addr?: string; signal?: AbortSignal; }
이다.server.ts
import { serve } from "https://deno.land/[email protected]/http/server.ts";
const addr = ":8080";
console.log(`HTTP server listening on http://localhost${addr}`)
serve((request: Request) => {
const { pathname } = new URL(request.url);
return new Response(`Hello world from ${pathname}`);
}, { addr });
addr
는 숫자가 아니라 문자열이다. host:port
형식으로 지정할 수 있기 때문에 본 예에서 보듯이 첫 번째 테이프:
는 port
부분만 설정할 수 있다.기본값은 "0.0.0.0:8000"
입니다.https://doc.deno.land/에서 최신 API 문서를 볼 수 있습니다.
이 형태로 만들어진 서버 파일을 Deno Deploy로 올리려 했지만 문제 없이 작업했다.
Deno 서버 이력
처음 추가된 트윗처럼 Deno에 서버를 만드는 여러 방법을 제시했다.
다음은 그런 것들을 대충 정리하고 싶습니다.
std/http의 서버 이전 버전
애초에 사용했던 물건이다.
본 글에서 소개한 std0.14.0의
serve
와 동명이지만 다른 물건으로 현재server_legacy에 있습니다.server_legacy.ts
import { serve } from "https://deno.land/std/http/server_legacy.ts";
const body = "Hello World\n";
const server = serve({ port: 8000 });
for await (const req of server) {
req.respond({ body });
}
당초server_legacy.ts
에서 읽지 않았기 때문에 지정된 버전이 없는 코드는 현재server.ts
와 다를 것이 없다.얼마 전 쓴 디노의 소개 글에는 대부분 이를 사용했다며 "보도된 샘플과 가져온 소스의 파일 이름과 방법명은 똑같은데 매개 변수와 사용법이 완전히 달라 움직일 수 없는..."라는 매우 번거로운 상태가 담겼다.
이것이 화근이 될 수 있기 때문에, 나는 이번 보도를 썼다.
addEventListener
Deno Deploy Beta 1시대에 사용된 수법이다.
beta1_server.ts
addEventListener("fetch", (event) => {
event.respondWith(new Response("Hello world"));
});
최근 Deno Deploy는 일반적인 CLI의 Deno 서버와는 전혀 다르게 쓰여졌습니다.
Deno Native HTTP
상기 구
serve
의 서버 성능이 좋지 않기 때문에 Deno 자체가 HTTP 서버 기능에 편입되었다.Deno1.9로 가져오고 1.13 안정화.
native_server.ts
for await (const conn of Deno.listen({ port: 8080 })) {
(async () => {
for await (const { respondWith } of Deno.serveHttp(conn)) {
respondWith(new Response("Hello World"));
}
})();
}
디노 1.13 발표 때https://deno.land 서버도 활용되며 실적을 쌓았다.그리고 이 기법은 Deno Deploy에서도 사용할 수 있으며 CLI와 같은 기술로 서버를 쓸 수 있다.
Deno Deploy Beta2의 발표 기사에도 이런 표기법이 사용됐다(위의
std/http
.이 1.13시에는 디노의 서버가 현지인 서버로 통일돼 폐지될 것으로 예상된다
addEventListener
.std/http listenAndServe
Deno의 로컬 HTTP 업데이트는 삭제
std/http
로 여겨졌지만, Deno 1.14와 병행하여 발표된 std0.17은 로컬 HTTPstd/http
를 사용하는 것이 추가되어 삭제는커녕 추천 방법으로 되돌아왔다.로컬 HTTP
listenAndServe
의 결과listen
에 둘러싸여 실행된 처리 프로그램에도 포함for await
...구조가 좀 복잡하지만 for await
랩으로 이 일대를 감싸 고성능을 얻으면서 서버는 좀 더 간단하게 기술할 수 있었다.beta3_server.ts
import { listenAndServe } from "https://deno.land/[email protected]/http/server.ts";
listenAndServe(":8000", () => new Response("Hello World\n"));
디노 1.16 보름 전 디노 디플로이 베타3 발표 기사에는 이쪽 기법이 사용됐다.std/http 서버 현행판
시간은 현대다.
최신 방법은 본고에서 소개한
listenAndServe
의 새로운 방법std/http
이다.데노 1.16의 발표문에서
serve
방법의 업데이트와 소개에 관한 부분에서 이 기법은 빈번하게 사용되었다.날과 씨
이 방법은 다음 PR에서 제안되었다.
import { serve } from "https://deno.land/std/http/server.ts";
serve((req) => new Response("Hello world"));
🐯 "Deno Deploy가 사용한 샘플을 깨끗하게 하고 싶다는 이름 자체가 없어요."거기서 토론이 있었고 아래의 PR은 채용이 이루어졌고
fetch
는 listenAndServe
가 되었다.끝말
지금까지 Deno 서버의 쓰기 방법과 기록입니다.
std가 아직 0이 안 됐어요.x이고 디노 디플로이도 베타이기 때문에 추천하는 방법은 암암 암 변화다.
이 때문에 중도에도 썼지만'범본과 기술이 같아도 움직이지 못하는 경우'가 발생할 수 있다.
공식 최신판 이외의 자료를 참고할 때 제작일과 갱신일을 확인하고 주의해서 사용하시기 바랍니다.
뭐, 이 글을 쓸 때 Deno Deploy 첫 페이지에 실린 샘플 스크립트도 업데이트되지 않았는데...
이 기사가 공식 보도보다 더 멀리 간 셈이다.
Reference
이 문제에 관하여(Deno에 서버를 구축하는 방법 2021년 11월 버전), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/kawarimidoll/articles/8031c2618fedca텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)