node之koa

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

请求静态资源中间件。

请求一般分成两种:

  1. 静态资源:图片,样式文件,脚本文件等等。
  2. 动态资源:需要去数据库中查找的资源。
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 路由参数

  1. 路由中只有一个参数的时候,路由参数可以使字符串。
const path = router.url('userInfo', '1234');
  1. 路由中有多个参数的时候,使用对象
const path = router.url('loginPost', {
    
    userName: 'gaoli', pwd: '987654'});

3.2 查询参数

  1. 对象形式
const path = router.url('loginGet', {
    
    }, {
    
    
	query: {
    
    
		userName: 'gaoli',
		pwd: '123456'
	}
});
  1. 字符串形式
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错误

github文档

猜你喜欢

转载自blog.csdn.net/qq_36968599/article/details/119537245