You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Deno中使用oak框架:如何为路由构建URL?

Oak框架实现ASP.NET Core风格的命名路由URL生成

可以实现。Oak本身未内置命名路由的管理与URL生成功能,但借助其底层依赖的path-to-regexp工具(你提到的compile功能),结合手动维护的路由名称映射,完全能复刻ASP.NET Core中的对应功能。

对应你习惯的操作步骤

  • 为路由命名:手动维护一个路由名称到路径模板的映射对象,比如:
    const namedRoutes = {
      orders: "/customer-orders/:id" // 也支持`/customer-orders/{id}`格式
    };
    
  • 设置路径:直接使用上述映射中的模板字符串作为路由路径
  • 注册路由:通过Oak的Router正常注册路由:
    const router = new Router();
    router.get(namedRoutes.orders, (ctx) => {
      ctx.response.body = "查看客户订单";
    });
    
  • 生成命名路由URL:借助path-to-regexp的compile函数实现,同时处理多余参数为查询字符串

完整实现示例

import { Application, Router } from "https://deno.land/x/oak/mod.ts";
import { compile, parse } from "https://deno.land/x/path_to_regexp@v6.2.1/index.ts";

// 维护命名路由与模板的映射
const namedRoutes = {
  orders: "/customer-orders/:id"
};

// 生成命名路由URL的工具函数
function generateNamedRouteUrl(routeName: string, routeValues: Record<string, unknown>) {
  const template = namedRoutes[routeName];
  if (!template) throw new Error(`路由 ${routeName} 不存在`);

  // 提取模板中定义的参数名
  const paramNames = parse(template).map(item => item.name).filter(name => typeof name === "string") as string[];
  
  // 分离路径参数和查询参数
  const pathParams: Record<string, unknown> = {};
  const queryParams: Record<string, unknown> = {};

  for (const [key, value] of Object.entries(routeValues)) {
    if (paramNames.includes(key)) {
      pathParams[key] = value;
    } else {
      queryParams[key] = value;
    }
  }

  // 生成路径部分
  const path = compile(template)(pathParams);
  // 拼接查询参数
  if (Object.keys(queryParams).length > 0) {
    const searchParams = new URLSearchParams(queryParams as Record<string, string>);
    return `${path}?${searchParams.toString()}`;
  }
  return path;
}

// 使用示例
const targetUrl = generateNamedRouteUrl("orders", { id: 193, x: "y" });
console.log(targetUrl); // 输出: /customer-orders/193?x=y

// 启动Oak应用
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());

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

path-to-regexp的Compile(反向路径生成)功能说明

compile函数是path-to-regexp提供的反向路径生成工具,它接收一个路径模板字符串,返回一个可生成具体URL的函数。该函数会将模板中的参数占位符(如:id或{id})替换为传入的对应值;对于模板中未定义的额外键值对,可通过逻辑处理自动转为URL查询参数。

它支持多种复杂模板场景,包括可选参数、重复参数、正则约束的参数等,完全满足常规的路由URL生成需求。

内容的提问来源于stack exchange,提问作者Luke Puplett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:16:12