首页 > web前端 > js教程 > miniframe-router:Express.JS 应用程序的路由器

miniframe-router:Express.JS 应用程序的路由器

DDD
发布: 2025-01-02 13:10:42
原创
280 人浏览过

miniframe-router — Express.JS 应用程序的极简路由器,灵感来自 Ruby on Rails。这是我的制作方法。

miniframe-router: Router for Express.JS Applications


路由在简单应用程序中的外观示例。

// Root routes
root("index#home");

// Basic CRUD routes
get("/users", "users#index");
get("/users/:id", "users#show");
post("/users", "users#create");
post("/users/:id", "users#update");
post("/users/:id/destroy", "users#destroy");

// Posts routes with scope
scope("blog", () => {
  get("/posts", "posts#index");
  get("/posts/:id", "posts#show");
  post("/posts", "posts#create");
  post("/posts/:id", "posts#update");
  post("/posts/:id/destroy", "posts#destroy");
});
登录后复制
登录后复制

语境

我大约有 10 年没有编写 NodeJS 应用程序了。出于对 Telegram Mini Apps 的好奇,我决定构建一些简单的项目来探索这个新领域。

为此,我需要为我的应用程序后端进行路由。现有的解决方案并没有给我留下深刻的印象,因此我决定创建自己的路由器 - 简单、有效,并且受到 Ruby on Rails 的启发。这也是一个很好的机会来刷新我创建 NPM 包的知识,这是我 9 年来没有做过的事情。


设计

对路由器的期望:

  1. 路由在单独的文件中定义

这简化了应用程序结构并避免主应用程序文件混乱。

import {
  root,
  get,
  post,
  routeScope as scope,
  getRouter,
} from "miniframe-router";

// Root routes
root("index#home");

// Basic CRUD routes
get("/users", "users#index");
get("/users/:id", "users#show");
post("/users", "users#create");
post("/users/:id", "users#update");
post("/users/:id/destroy", "users#destroy");

// Posts routes with scope
scope("blog", () => {
  get("/posts", "posts#index");
  get("/posts/:id", "posts#show");
  post("/posts", "posts#create");
  post("/posts/:id", "posts#update");
  post("/posts/:id/destroy", "posts#destroy");
});

export default getRouter;
登录后复制
  1. 路由器集成到主 ExpressJS 文件中

简单有效的应用程序入口点:src/index.js 或 src/main.js。

import express from "express";
import getRouter from "./routes"; // <<< DEFINE ROUTES

const app = express();
app.use(express.json());
app.use(getRouter()); // <<< USER ROUTES

app.listen(3000, () => {
  console.log("Demo app is running on http://localhost:3000");
});
登录后复制
  1. 连接控制器时遵循的约定

控制器位于 src/controllers 目录中。

MyApp
└── src
    ├── controllers
    │   ├── blog
    │   │   └── postsController.ts
    │   ├── indexController.ts
    │   └── usersController.ts
    ├── index.ts
    └── routes
        └── index.ts
登录后复制

文件结构

  • 路由在 src/routes/index.js 中定义。
  • 控制器包含处理请求的逻辑:

示例:src/controllers/usersController.ts(或 .js)。

// Root routes
root("index#home");

// Basic CRUD routes
get("/users", "users#index");
get("/users/:id", "users#show");
post("/users", "users#create");
post("/users/:id", "users#update");
post("/users/:id/destroy", "users#destroy");

// Posts routes with scope
scope("blog", () => {
  get("/posts", "posts#index");
  get("/posts/:id", "posts#show");
  post("/posts", "posts#create");
  post("/posts/:id", "posts#update");
  post("/posts/:id/destroy", "posts#destroy");
});
登录后复制
登录后复制

执行

步骤:

  1. 使用Docker创建开发容器。
  2. 设置 ESBuild 将 TypeScript 编译为 JavaScript。
  3. 安装Jest进行测试。
  4. 编写测试来验证路由器的第一个版本。
  5. 实施路由器,直到所有测试通过。
  6. 恢复我长期未使用的 NPM 凭证(9 年后)。
  7. 将 NPM 包发布为版本 1.0.0。
  8. 修复关键安装错误并删除版本 1.0.0 和 1.1.0。 ?
  9. 将路由器应用到一个有十几条路由的生产项目中。

问答

为什么还要这样做?现有的解决方案有很多!

  • 有趣有用,并且有助于解决方案的多样性。

为什么这么简单?难道不应该更复杂吗?

  • 遵循KISS原则。稍后可以根据需要添加复杂性。

为什么是控制器?它们不是不必要的吗?

  • 控制器对于小型项目来说很方便。更高的抽象(例如类似操作/操作的解决方案)更适合更大的系统。

这个解决方案是否有效?

  • 绝对!该路由器在一个小型生产应用中使用,并且在数十条路由中表现完美。

它可以处理什么规模的项目?

  • miniframe-router适合有几十条路由的应用。没有严格的尺寸限制。

结论

项目代码和文档:GitHub - miniframe-router

NPM 包:miniframe-router

点赞、分享和订阅!始终欢迎建设性反馈。

作者页面:GitHub - the-teacher

以上是miniframe-router:Express.JS 应用程序的路由器的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板