## 入口
```
const Koa = require("koa");
const app = new Koa();
const bodyParser = require("koa-bodyparser");
app.use(bodyParser());
const UserRouter = require("./routers/User")();
app.use(UserRouter.routes(), UserRouter.allowedMethods());
setTimeout(() => {}, 2000);
app.listen(3001, () => {
console.log("Server is running at http://localhost:3001");
});
```
## routers/User
```
const Router = require("@koa/router");// koa 路由
const router = new Router();
// get
/*
fetch("http://127.0.0.1:3000/users/1?asd=11").then((response) => {
response.json().then((data) => console.log(1, data));
});
*/
router.get("/users/:id?", async (ctx, next) => {
// 读取请求头
let header = ctx.request.headers;
console.log(header, header.host);
// {
// host: '127.0.0.1:3001',
// connection: 'keep-alive',
// 'cache-control': 'max-age=0',
// 'sec-ch-ua': '"Microsoft Edge";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
// 'sec-ch-ua-mobile': '?0',
// 'sec-ch-ua-platform': '"Windows"',
// 'upgrade-insecure-requests': '1',
// 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0',
// accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
// 'sec-fetch-site': 'none',
// 'sec-fetch-mode': 'navigate',
// 'sec-fetch-user': '?1',
// 'sec-fetch-dest': 'document',
// 'accept-encoding': 'gzip, deflate, br, zstd',
// 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6'
// }
// 127.0.0.1:3001
let query = ctx.query;
console.log(query, query.asd);
let params = ctx.params;
console.log(params, params.id);
// 自定义设置响应头
ctx.set("a", 1);
// 返回数据体
ctx.body = {
a: 1,
b: 2,
method: "GET",
query,
params,
};
next();
});
// post
/*
fetch("http://127.0.0.1:3000/users/1?asd=11", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "John Doe",
email: "johndoe@example.com",
}),
}).then((response) => {
response.json().then((data) => console.log(1, data));
});
*/
router.post("/users/:id", async (ctx, next) => {
const body = ctx.request.body;
console.log(body, body.name);
const query = ctx.query;
console.log(query, query.asd);
const params = ctx.params;
console.log(params, params.id);
ctx.body = {
a: 1,
b: 2,
method: "POST",
body,
query,
params,
};
next();
});
// delete
/*
fetch("http://127.0.0.1:3000/users/1?AAA=1", {
method: "DELETE",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "John Doe",
email: "johndoe@example.com",
}),
}).then((response) => {
// console.log("response: ", response);
response.json().then((data) => console.log(1, data));
});
*/
router.delete("/users/:id", async (ctx, next) => {
let body = ctx.request.body;
console.log(body, body.name);
let query = ctx.query;
console.log(query, query.AAA);
let params = ctx.params;
console.log(params, params.id);
ctx.body = {
a: 1,
b: 2,
method: "DELETE",
body,
query,
params,
};
next();
});
// put
router.put("/users", async (ctx, next) => {
ctx.body = {
a: 1,
b: 2,
method: "PUT",
};
next();
});
// patch
router.patch("/users", async (ctx, next) => {
ctx.body = {
a: 1,
b: 2,
method: "PATCH",
};
next();
});
module.exports = () => {
return router;
};
```
## 常用中间件
| 名称 | 安装命令 | 作用 | 应用场景 |
| --- | --- | --- | --- |
| koa-router | npm install koa-router | 提供路由功能,帮助你定义和处理路由 | 在需要处理多个路由的Web应用中 |
| koa-bodyparser | npm install koa-bodyparser | 解析HTTP请求体,可以解析JSON、表单数据等 | 在需要处理用户提交的数据的Web应用中 |
| koa-static | npm install koa-static | 托管静态文件,如HTML、CSS、JavaScript文件和图片等 | 在需要提供静态资源访问的Web应用中 |
| koa-session 或 koa-cookie | npm install koa-session或npm install koa-cookie | 处理会话和Cookie,可以帮助你实现用户认证和授权 | 在需要用户登录和权限控制的Web应用中 |
| koa-logger | npm install koa-logger | 记录请求日志,可以帮助你调试你的应用 | 在需要记录和查看请求日志的Web应用中 |
| koa-json | npm install koa-json | 美化JSON响应 | 在需要返回格式化的JSON数据的Web应用中 |
| koa-compress | npm install koa-compress | 压缩HTTP响应,可以帮助你提高应用的性能 | 在需要提高响应速度和减少网络传输量的Web应用中 |
| koa-helmet | npm install koa-helmet | 增强HTTP响应安全性,设置了许多HTTP头以防止常见的攻击 | 在需要提高Web应用安全性的场景中 |
## cmd命令创建koa+node后端项目
#### Koa-generate
使用Koa开发后端服务固然方便容易,但是面对中大型项目,手动构建文件目录和一些常见代码是很低效的,因此便有开发者基于Koa开发出来Koa项目生成器–`Koa-generate`,这个工具可以让开发者快速构建中大型项目的的项目目录结构,加速开发进度;
首先我们需要配置环境,下载该库:
`npm install -g koa-generator`
命令生成Koa项目:`koa2 project-name map-visual //或者 koa2 -e project-name`
* `koa2 project-name map-visual`:这个命令会创建一个新的Koa项目,使用的模板引擎是默认的jade(也被称为pug)。
* `koa2 -e project-name`:这个命令也会创建一个新的Koa项目,但是使用的模板引擎是ejs。-e选项是–ejs的简写,表示使用ejs作为模板引擎。