diff --git a/.gitignore b/.gitignore index bbe148e..45433f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ # 环境变量文件 .env -node_modules/ \ No newline at end of file +node_modules/ +package-lock.json diff --git a/api/example.js b/api/example.js new file mode 100644 index 0000000..18dfe75 --- /dev/null +++ b/api/example.js @@ -0,0 +1,7 @@ +// api/example.js +module.exports = (ctx) => { + ctx.body = { + message: 'Example POST API', + data: ctx.request.body + }; +}; \ No newline at end of file diff --git a/app.js b/app.js index 67f1f37..d7984f0 100644 --- a/app.js +++ b/app.js @@ -1,34 +1,59 @@ -require('dotenv').config(); // 在文件最顶部加载环境变量 - -const Koa = require('koa'); -const Router = require('koa-router'); -const jwt = require('jsonwebtoken'); -const koaJwt = require('koa-jwt'); +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.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' }); +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/] -})); +// JWT中间件(保护下方所有路由) +app.use( + koaJwt({ + secret: process.env.JWT_SECRET, + }).unless({ + path: [/^\/public/, /^\/login/], + }) +); + +// 加载自动生成的路由 +loadAPIRoutes(); // 受保护路由 -router.get('/protected', ctx => { +router.get("/protected", (ctx) => { ctx.body = `Protected content for ${ctx.state.user.username}`; }); @@ -37,4 +62,4 @@ app.use(router.allowedMethods()); app.listen(process.env.PORT || 3000, () => { console.log(`Server running on http://localhost:${process.env.PORT || 3000}`); -}); \ No newline at end of file +}); diff --git a/package.json b/package.json index 50f9650..0447643 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dotenv": "^16.4.7", "jsonwebtoken": "^9.0.2", "koa": "^2.15.4", + "koa-bodyparser": "^4.4.1", "koa-jwt": "^4.0.4", "koa-router": "^13.0.1" }