目录
前言
该篇文章旨在解决在当前目录环境下,如何对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);
}