你可能已经写过不少 API,但每次新开项目,还是会陷入:
“这次到底用 Express 还是 Koa?”
“这路由怎么写才不会越来越乱?”
“中间件、服务层、控制器到底要不要分?”
本篇文章不讲“Hello World”,而是带你一步步构建一个结构清晰、可扩展、适合团队协作的 Node.js 服务项目。
上手简单,生态庞大
自带 middleware 系统 + 路由机制
老牌框架,稳定性好,文档丰富
更轻量、更现代(由 Express 团队重写)
默认没有路由/中间件,需自行组合
使用 async/await 中间件更优雅(原生支持)
适合场景 |
推荐框架 |
---|---|
快速搭建、文档多、团队协作小 |
Express |
注重极致控制、自定义能力强、团队经验成熟 |
Koa |
我们后续以 Koa 为例展开,但 Express 的结构也通用。
my-service/
├── src/
│ ├── controllers/ # 控制器层:处理路由逻辑
│ ├── services/ # 服务层:处理业务逻辑
│ ├── routes/ # 路由定义
│ ├── middlewares/ # 中间件(鉴权、日志等)
│ ├── utils/ # 工具函数
│ ├── config/ # 配置文件
│ ├── app.js # 初始化入口
│ └── server.js # 启动服务
├── tests/ # 单元/接口测试
├── .env # 环境变量
├── package.json
└── README.md
npm install koa koa-router koa-bodyparser dotenv
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const registerRoutes = require('./routes');
require('dotenv').config();
const app = new Koa();
// 中间件
app.use(bodyParser());
// 注册路由
registerRoutes(app);
module.exports = app;
const app = require('./app');
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(` Server running at http://localhost:${PORT}`);
});
const Router = require('koa-router');
const userRoutes = require('./user');
module.exports = (app) => {
const router = new Router({ prefix: '/api' });
router.use(userRoutes.routes());
app.use(router.routes()).use(router.allowedMethods());
};
exports.getProfile = async (ctx) => {
ctx.body = { id: 1, name: 'Node Dev' };
};
const Router = require('koa-router');
const { getProfile } = require('../controllers/userController');
const router = new Router({ prefix: '/user' });
router.get('/profile', getProfile);
module.exports = router;
日志:接入 winston / pino
配置管理:dotenv + config 模块化方案
统一错误处理中间件
健康检查路由 /health
基础测试结构(Jest / Supertest)
Node.js 服务的关键不是能不能跑,而是能不能“一直跑下去,还能方便别人接手”。
所以你要构建的,不是一个“项目”,而是一个“框架基础”。
用 Koa 或 Express 搭好结构
抽离路由 / 控制器 / 服务层
统一中间件、日志、配置
这才是从“写接口”走向“搭系统”的第一步。