Files
vless-api/app.js
aixianling 18eb590629 feat(api): 实现 API 路由自动加载并优化路由处理
- 新增 api/example.js 文件作为示例 POST API
- 在 app.js 中添加(bodyParser) 中间件
- 实现 loadAPIRoutes 函数自动加载 API 路由
- 更新 JWT 中间件配置,保护 /login 路由
- 优化路由定义,使用箭头函数
2025-02-24 17:46:27 +08:00

66 lines
1.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

require("dotenv").config();
const Koa = require("koa");
const Router = require("koa-router");
const jwt = require("jsonwebtoken");
const koaJwt = require("koa-jwt");
const fs = require("fs");
const path = require("path");
const bodyParser = require("koa-bodyparser");
const app = new Koa();
app.use(bodyParser()); // 添加在路由中间件之前
const router = new Router();
// 自动加载API路由函数
const loadAPIRoutes = () => {
const apiDir = path.join(__dirname, "api");
const files = fs.readdirSync(apiDir);
files.forEach((file) => {
if (file.endsWith(".js") && file !== "index.js") {
const routePath = `/${file.replace(".js", "")}`;
const handler = require(path.join(apiDir, file));
router.post(routePath, async (ctx) => {
await handler(ctx);
});
}
});
};
// 公开路由
router.get("/public", (ctx) => {
ctx.body = "Public content";
});
// 登录路由
router.post("/login", (ctx) => {
const user = { id: 1, username: "admin" };
const token = jwt.sign(user, process.env.JWT_SECRET, { expiresIn: "1h" });
ctx.body = { token };
});
// JWT中间件保护下方所有路由
app.use(
koaJwt({
secret: process.env.JWT_SECRET,
}).unless({
path: [/^\/public/, /^\/login/],
})
);
// 加载自动生成的路由
loadAPIRoutes();
// 受保护路由
router.get("/protected", (ctx) => {
ctx.body = `Protected content for ${ctx.state.user.username}`;
});
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(process.env.PORT || 3000, () => {
console.log(`Server running on http://localhost:${process.env.PORT || 3000}`);
});