serve 的返回类型 曾经是 Server(这是异步可迭代的)直到std 版本0.106.0:这里是a link 到那个版本的serve .这可能就是您看到使用这种方式的示例的原因。
从std 的版本0.107.0 开始,serve 的签名changed 改为接受Handler(并返回Promise<void>)。
这是a link 到当前版本serve(来自std@0.123.0)的文档,下面是一个如何使用它的示例:
so-70963882.ts:
import { serve } from "https://deno.land/std@0.123.0/http/server.ts";
function requestHandler (request: Request): Response {
const data = {
url: request.url,
headers: Object.fromEntries([...request.headers].sort()),
};
console.log(data);
const body: BodyInit = JSON.stringify(data, null, 2);
const headers = new Headers([['content-type', 'application/json']]);
const init: ResponseInit = {headers};
return new Response(body, init);
}
const ac = new AbortController();
serve(requestHandler, { port: 4000, signal: ac.signal });
const responseText = await (await fetch('http://localhost:4000')).text();
console.log(responseText);
ac.abort();
在控制台中:
deno run --allow-net ./so-70963882.ts
{
url: "http://localhost:4000/",
headers: {
accept: "*/*",
"accept-encoding": "gzip, br",
host: "localhost:4000",
"user-agent": "Deno/1.18.1"
}
}
{
"url": "http://localhost:4000/",
"headers": {
"accept": "*/*",
"accept-encoding": "gzip, br",
"host": "localhost:4000",
"user-agent": "Deno/1.18.1"
}
}
对于导入的模块,您应该始终使用版本化的 URL——它们更有可能“不可变”(提供幂等响应)。