typescript Deno中$_SERVER[“REQUEST_URI”]的等价物是什么?

hgc7kmma  于 2023-04-22  发布在  TypeScript
关注(0)|答案(2)|浏览(125)

我是Deno的新手,我想知道PHP变量$_SERVER["REQUEST_URI"]的等效变量是什么?
我尝试了无数的函数,但都返回为“不是函数”。

m0rkklqb

m0rkklqb1#

Deno有几个不同的Web服务器API(然后还有构建在它们之上的框架)。但我认为大多数(所有?)都为处理程序提供了Request object,它有一个url属性,告诉你请求的URL是什么。

hmae6n7t

hmae6n7t2#

PHP可以有一个全局变量来存储请求URL,因为它的工作方式与Deno不同。
在Deno中,你通常在一些请求处理函数的一个参数中获得URL,但是如果你使用任何框架来帮助你处理这些请求,你通常甚至不需要它(参见下面的示例)。
使用std库中的裸serve实用程序,您可以像这样处理请求:

import { serve } from "https://deno.land/std@0.183.0/http/server.ts";

function handler(req: Request): Response {
    console.log("Request URL:", req.url);
    return new Response("Response: OK");
}

serve(handler);

在上面的示例中,req.url之所以存在,是因为它在每次调用handler()函数(针对每个请求)时都被传递给该函数,因为该函数通过调用serve(handler);注册为所有请求的处理程序
如果将其保存为main.ts,则可以使用以下命令运行此程序:

deno run --allow-net main.ts

默认端口是8000,所以你可以运行curl来发出这样的请求:

deno run --allow-net main.ts

它将显示:

Request URL: http://localhost:8000/abc

现在,这是一个非常低级的API,实际上你可能想使用像oak这样的库。例如,要有一个使用oak的等效服务器,它的工作方式与前面的例子中的serve不同,你可以使用这样的东西:

import { Application } from "https://deno.land/x/oak/mod.ts";

const app = new Application();

app.use((ctx) => {
  console.log("Request URL:", ctx.request.url.href);
  ctx.response.body = "Response: OK";
});

await app.listen({ port: 8000 });

因此,在这里,您访问的URL不是req.url,而是ctx.request.url.href(或者如果您命名参数不同,则以ctx以外的其他名称开始)。.href在这里以字符串的形式获取完整的URL,因为ctx.request.url是一个对象-URL的示例)。

但是你通常不会这样访问你的URL,而是使用单独的处理程序来定义路由,这些处理程序会为特定的URL运行,例如:

import { Application, Router } from "https://deno.land/x/oak/mod.ts";

const router = new Router();
router
  .get("/abc", (context) => {
    // we know that so we can hardcode it ...
    console.log("Request for: /abc");
    context.response.body = "Response from /abc";
  })
  .get("/def", (context) => {
    // ... or we can access the context
    console.log("Request for:", context.request.url.pathname);
    context.response.body = "Response from /def";
    
  });

const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());

await app.listen({ port: 8000 });

请注意,我们不必在这些处理程序中测试URL,但我们当然可以。它们已经知道它们正在服务哪个URL,因为oak库运行它们以获得它们需要服务的正确路由。
因此,这完全取决于您使用什么框架库来处理请求--您通常会为生产代码而不是直接使用serve(除非您有一些非常特殊的需求)。
要找到适合您需求的良好框架,请参阅:

相关问题