> # 前言
nodejs的封装框架有很多,比如egg,express,nestjs,koa等,但由于我一开始接触的koa,而且感觉也相对比较简单所以也就用koa了。
> # 入门
## 安装
`npm install koa`即可
## 简单使用
```javascript
// app.js
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next) => {
ctx.body = {
code: 0,
msg: '成功'
}
});
app.listen(3000);
// 然后node app.js然后打开localhost:3000就可获得{code:0,msg:'成功'}这串文字
```
## async和await的使用
```javascript
const Koa = require('koa');
const app = new Koa();
// 第一个中间件
app.use(async (ctx, next) => {
await next(); // 此处等待next(),所以暂时不执行括号内接下去的代码,进入到下一个中间件的代码,下一个中间件代码执行完毕后才返回继续执行
console.log('t3:'+ctx.response.get('X-Response-Time'))
console.log(`method: ${ctx.method} url: ${ctx.url}`)
});
// 第二个中间件
app.use(async (ctx, next)=>{
const start = Date.now();
console.log('t1:'+start);
await next();
const ms = Date.now() - start;
console.log('t2:'+ms);
ctx.set('X-Response-Time', `${ms}ms`);
});
// 第三个中间件
app.use(async (ctx, next)=>{
console.log('hello world');
ctx.body = 'hello world';
})
app.listen(9000);
// 执行的结果:
// t1: 15758120938358
// hello world
// t2: 19
// t3: 19ms
// method:GET url: /
// 这块主要让你了解中间件,async异步的await执行逻辑,以及ctx中包含了几乎所有页面你中输入输出的东西
```
## koa的插件:
- **koa-router:api的url设定**
```javascript
const Router = require('koa-router');
const router = new Router();
// 接口为/login,post传参
router.post('/login', async (ctx, next) => {
const req = ctx.request.body;
const user = await user_model.findOne({
account: req.account
}, {__v: 0, _id: 0});
ctx.status = 200;
if (!user) {
ctx.body = {
code: 0,
msg: '账户或密码错误'
}
}
const userId = user.uesrId;
const pass = await password_model.findOne({
userId
}, {hash: 1});
// 验证输入的命名是否符合加密后的hash值
const match = await passport.validate(req.password, pass.hash);
if (match) {
return ctx.body = {
code: 1,
msg: '登陆成功',
data: user
}
}
ctx.body = {
code: 1,
msg: '账户或密码错误',
}
});
module.exports = router;
// server/app.js
const user_router = require('./routes/api/user_router.js');
// 在koa-router插件中,要求在中间件user_router.routes()被调用后再调用allowedMethods()
app.use(user_router.routes()).use(user_router.allowedMethods());
```
- **koa2-cors:解决跨域问题的插件**
```javascript
// 使用:在router之前调用
// app.js
const cors = require('koa2-cors');
app.use(cors());
```
- **koa-bodyparser:解析请求体的插件**
```javascript
// 使用:在router之前调用
// app.js
const bodyParser = require('koa-bodyparser');
app.use(bodyParser ());
```