1. 中间件
1.1 @koa/cors
解决跨域问题的中间件。
npm i @koa/cors -S
https://www.npmjs.com/package/@koa/cors
1.2 koa-body
处理post请求和文件上传的请求数据。
npm i koa-body -S
1.3 koa-static
请求静态资源中间件。
请求一般分成两种:
- 静态资源:图片,样式文件,脚本文件等等。
- 动态资源:需要去数据库中查找的资源。
npm i koa-static -S
1.4 koa-router
路由中间件。
npm i koa-router -S
1.5 chalk
修改终端日志样式的npm包。
npm i chalk -S
2. 实例
2.1 default-config.js
const DEFAULT_OPTION = {
baseUrl: '/',
method: 'post',
port: '8888'
}
const FORMAT = {
codeKey: 'code',
msgKey: 'msg',
dataKey: 'data',
succCode: '000000',
timeoutCode: '299999'
}
module.exports = {
defaultOption: DEFAULT_OPTION,
format: FORMAT
};
2.2 util
// 格式化成功的响应数据格式
function succ(data = {
}, message = '交易处理成功...') {
const format = this.format;
let response = {
[format.codeKey]: format.succCode,
[format.msgKey]: message
};
if (format.dataKey) {
return {
...response,
[format.dataKey]: data
};
}
return {
...response,
...data
};
}
// 格式化失败的响应数据格式
function fail(failCode, data = {
}, message = '交易处理失败...') {
const format = this.format;
const response = {
[format.codeKey]: failCode,
[format.msgKey]: message
};
if (format.dataKey) {
return {
...response,
[format.dataKey]: data
};
}
return {
...response,
...data
}
}
module.exports = function (options) {
return {
succ: succ.bind(options),
fail: fail.bind(options)
}
};
2.3 server.js
const Koa = require('koa');
const KoaRouter = require('koa-router');
const koaCors = require('@koa/cors');
const koaBody = require('koa-body');
const {
cyan} = require('chalk');
const {
defaultOption, format} = require('./default-config');
const util = require('./util')({
...defaultOption, format});
let app = new Koa();
let koaRouter = new KoaRouter();
// 处理路由参数
koaRouter.param('userName', (id, ctx, next) => {
console.log('404');
return next();
})
koaRouter.get('loginGet', '/login', (ctx, next) => {
const {
userName, pwd } = ctx.query;
if (userName === 'gaoli' && pwd === '987654') {
ctx.response.body = util.succ({
userName: 'gaoli', id: '3456'});
}
else {
ctx.response.body = util.fail('111111', {
code: '111111', msg: '用户名或者密码不正确!'});
}
})
koaRouter.post('/login', (ctx, next) => {
const {
userName, pwd } = ctx.request.body;
if (userName === 'gaoli' && pwd === '987654') {
ctx.response.body = util.succ({
userName: 'gaoli', id: '3456'});
}
else {
ctx.response.body = util.fail('111111', {
code: '111111', msg: '用户名或者密码不正确!'});
}
})
// 路由参数请求
koaRouter.get('loginPost', '/login/:userName/:pwd', ctx => {
const {
userName, pwd } = ctx.params;
if (userName === 'gaoli' && pwd === '987654') {
ctx.response.body = util.succ({
userName: 'gaoli', id: '3456'});
}
else {
ctx.response.body = util.fail('111111', {
code: '111111', msg: '用户名或者密码不正确!'});
}
})
// 命名路由
koaRouter.get('register', '/register/:flag', ctx => {
if (flag === true) {
ctx.body = util.succ({
pageId: 'register.html'});
}
else {
const path = koaRouter.url('loginPost', {
userName: 'gaoli', pwd: '987654'});
// 重定向到path,只能是get请求
ctx.redirect(path);
}
})
// 解决跨域问题
app.use(koaCors());
// 处理请求参数
app.use(koaBody());
app.use(koaRouter.routes());
app.use(koaRouter.allowedMethods())
// 启动服务器,监听端口
const {
port, baseUrl } = defaultOption;
app.listen(port, () => {
console.info(
'\n服务器已启动 =>',
cyan(`http://127.0.0.1:${
port}${
baseUrl}`)
)
})
API
const KoaRouter = require('koa-router');
1. Router
创建router实例。
let Router = new KoaRouter([opt]);
let router = new KoaRouter({
prefix: '/web'
});
// url: /web/login
router.get('/login', (ctx, next) => {
})
param | type | description |
---|---|---|
opt | Object | |
opt.prefix | String | 路由前缀 |
1.1 router.prefix();
设置路由前缀。
router.prefix('/web');
2. get|post|put|patch|delete|del
router[method]([routeName,] url, [middleware], callback);
param | type | description |
---|---|---|
routeName | String | 路由名称,该参数存在表示命名路由 |
url | String | 路由 |
middleware | Function | 中间件 |
callback | Function | 回调函数 |
2.1 普通路由
router
.get('/', (ctx, next) => {
ctx.body = 'Hello World!';
})
.post('/users', (ctx, next) => {
// ...
})
.put('/users/:id', (ctx, next) => {
// ...
})
.del('/users/:id', (ctx, next) => {
// ...
})
.all('/users/:id', (ctx, next) => {
// ...
});
2.2 命名路由
router.post('userInfo', '/getUserInfo/:id', ctx => {
})
2.3 使用多个中间件
router.get('/getUserInfo/:id', (ctx, next) => {
console.log('middleware');
next();
},
ctx => {
console.log('callback');
})
3. router.url()
生成完成路径
const path = router.url(routeName, urlParams, [options]);
param | type | description |
---|---|---|
routeName | String | 路由名称,该参数存在表示命名路由 |
urlParams | String|Object | 路由参数 |
options | Object | |
options.query | String|Object | 查询参数 |
3.1 路由参数
- 路由中只有一个参数的时候,路由参数可以使字符串。
const path = router.url('userInfo', '1234');
- 路由中有多个参数的时候,使用对象
const path = router.url('loginPost', {
userName: 'gaoli', pwd: '987654'});
3.2 查询参数
- 对象形式
const path = router.url('loginGet', {
}, {
query: {
userName: 'gaoli',
pwd: '123456'
}
});
- 字符串形式
const path = router.url('loginGet', {
}, {
query: 'userName=gaoli&pwd=123456'
});
4. router.redirect()
重定向到get接口。
router.redirect(source, destination, [code]);
param | type | description |
---|---|---|
source | String | 路由名称或者是路径 |
destination | String | 路由名称或者是路径 |
code | Number | http状态码 |
router.redirect('/page/1', 'page/2');
router.redirect('userInfo', 'loginGet');
5. ctx.redirect()
ctx.redirect(destination, [code]);
router.get('userInfo', 'getUserInfo/:id', (ctx, next) => {
ctx.redirect(loginGet);
})
5. router.route()
查找路由。路由不存在返回false,路由存在返回Layer(路由以及接口信息)。
const layer = router.route(routeName);
param | type | description |
---|---|---|
routeName | String | 路由名称 |
7. router.routes()
返回一个和请求匹配的路由中间件。
6. router.use()
给匹配到的路由使用中间件。返回路由对象
router.use([path], middleware)
param | type | description |
---|---|---|
path | String|Array | 路由 |
middleware | Function | 中间件 |
[…] | Function | 中间件 |
6.1 嵌套路由
var forums = new Router();
var posts = new Router();
posts.get('/', (ctx, next) => {
...});
posts.get('/:pid', (ctx, next) => {
...});
forums.use('/forums/:fid/posts', posts.routes(), posts.allowedMethods());
// responds to "/forums/123/posts" and "/forums/123/posts/123"
app.use(forums.routes());
7. router.param()
为匹配到的路由参数运行中间件。返回router实例。
router.param(param, middleware)
param | type | description |
---|---|---|
param | String | 路由参数名称 |
middleware | Function | 中间件 |
koaRouter.param('userName', (id, ctx, next) => {
console.log('404');
return next();
})
8. router.allowedMethods()
返回一个中间件格式的函数。
router.allowedMethods([options])
param | type | description |
---|---|---|
options | Object | |
options.trow | Boolean | 抛出错误,而不是设置状态和标题 |
options.notImplemented | Function | 抛出返回值以替换默认的NotImplemented错误 |
options.methodNotAllowed | Function | 抛出返回值以替换默认MethodNotAllowed错误 |