实践:在Deno中对Oak Router动态引用

本文介绍了在Deno环境中,如何动态地从routers文件夹中导入和使用文件,通过ReadRouters类实现文件夹遍历和路由加载,以及在user.ts和main.ts中的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

       该篇文章旨在解决在当前目录环境下,如何对routers文件夹中的文件进行动态引用的问题,并热忱欢迎各位同行针对本文的任何遗漏或不完善之处提出宝贵意见和建议。同时,我们也期待大家能分享可能存在的更为优化的解决方案。需要特别强调的是,文中所述的方法是基于实际项目场景下的个性化实践案例,其目的是为面临类似问题的读者提供一种可行的解决思路参考,而非绝对标准答案。

一、read_routers.ts

import * as path from "https://deno.land/std@0.217.0/path/mod.ts";
import * as fs from "https://deno.land/std@0.208.0/fs/mod.ts";
const __dirname = path.dirname(path.fromFileUrl(import.meta.url));
const folderRoutersPath = path.join(__dirname, "routers");
export class ReadRouters {
  private _exclude: string[] = ["index.ts"];
  private _fileNames: string[] = [];
  public readFolder() {
    return new Promise<string>((resolve, reject) => {
      try {
        const isExists = fs.existsSync(folderRoutersPath, {
          isDirectory: true,
        });
        if (!isExists) {
          throw Error("未找到文件夹");
        }
        const dir = Deno.readDirSync(folderRoutersPath);
        for (const dirEntry of dir) {
          const name = dirEntry.name;
          !this._exclude.includes(name) && this._fileNames.push(name);
        }
        resolve("success");
      } catch (error) {
        reject("error");
        console.log(error);
      }
    });
  }

  public useRouters() {
    try {
      if (this._fileNames.length === 0) {
        throw Error("没有目标项");
      }
      const import_all: Array<Promise<any>> = [];
      for (let index = 0; index < this._fileNames.length; index++) {
        const element = this._fileNames[index];
        import_all.push(import(`./routers/${element}`));
      }
      return Promise.all(import_all);
    } catch (error) {
      console.log(error);
      return Promise.reject(error);
    }
  }
}

二、user.ts

import { Router } from "https://deno.land/x/oak@v13.0.0/mod.ts";

const router = new Router({
  prefix: "/api",
});

// 获取用户
router.get("/user", (ctx) => {
  ctx.response.body = "get user";
});

// 获取用户详情
router.get("/user/:id", (ctx) => {
  ctx.response.body = "get user";
});

// 添加用户
router.post("/user", (ctx) => {
  ctx.response.body = "post user";
});

// 删除用户
router.delete("/user/:id", (ctx) => {
  ctx.response.body = "delete user";
});

// 修改用户
router.patch("/user/:id", (ctx) => {
  ctx.response.body = "patch user";
});

export default router;

三、main.ts

import { Application, Router } from "https://deno.land/x/oak@v13.0.0/mod.ts";
import { ReadRouters } from "./read_routers.ts";

try {
  const app = new Application();

  const readRouters = new ReadRouters();

  await readRouters.readFolder();

  const routers: Array<{ default: Router<Record<string, any>> | undefined }> =
    await readRouters.useRouters();
  for (const router of routers) {
    if (router.default !== undefined) {
      app.use(router.default.routes());
    }
  }

  app.use((ctx) => {
    ctx.response.body = "文件夹管理系统";
  });

  await app.listen({ port: 8000 });
} catch (error) {
  console.log(error);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值