node之koa

1. ミドルウェア

1.1 @koa/cors

クロスドメインの問題を解決するミドルウェア。

npm i @koa/cors -S

https://www.npmjs.com/package/@koa/cors

1.2 本体も

投稿リクエストとファイルアップロードのリクエストデータを処理します。

npm i koa-body -S

1.3 コア静的

静的リソースミドルウェアをリクエストします。

リクエストは通常​​、次の 2 つのタイプに分類されます。

  1. 静的リソース: 画像、スタイル ファイル、スクリプト ファイルなど。
  2. 動的リソース: データベース内で検索する必要があるリソース。
npm i koa-static -S

1.4 ジョイルーター

ルーティングミドルウェア。

npm i koa-router -S

チョーク1.5本

ターミナルのログ形式を変更する npm パッケージ。

npm i chalk -S

2. 例

2.1 デフォルト設定.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 ユーティリティ

// 格式化成功的响应数据格式
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 サーバー.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.ルーター

ルーターインスタンスを作成します。

let Router = new KoaRouter([opt]);
let router = new KoaRouter({
    
    
	prefix: '/web'
});
// url: /web/login
router.get('/login', (ctx, next) => {
    
    })
パラメータ タイプ 説明
選択する 物体
オプト.プレフィックス ルーティングプレフィックス

1.1 router.prefix();

ルートプレフィックスを設定します。

router.prefix('/web');

2. get|post|put|patch|delete|del

router[method]([routeName,] url, [middleware], callback);
パラメータ タイプ 説明
ルート名 ルート名。このパラメータの存在は名前付きルートを示します。
URL ルーティング
ミドルウェア 関数 ミドルウェア
折り返し電話 関数 折り返し電話

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]);
パラメータ タイプ 説明
ルート名 ルート名。このパラメータの存在は名前付きルートを示します。
urlParams 文字列|オブジェクト ルーティングパラメータ
オプション 物体
オプション.クエリ 文字列|オブジェクト クエリパラメータ

3.1 ルーティングパラメータ

  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()

取得インターフェイスにリダイレクトします。

router.redirect(source, destination, [code]);
パラメータ タイプ 説明
ソース ルート名またはパス
行き先 ルート名またはパス
コード 番号 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);
パラメータ タイプ 説明
ルート名 路線名

7. router.routes()

リクエストに一致するルーティング ミドルウェアを返します。

6. router.use()

ルートのマッチングにはミドルウェアを使用します。戻りルートオブジェクト

router.use([path], middleware)
パラメータ タイプ 説明
文字列|配列 ルーティング
ミドルウェア 関数 ミドルウェア
[…] 関数 ミドルウェア

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.param(param, middleware)
パラメータ タイプ 説明
パラメータ ルートパラメータ名
ミドルウェア 関数 ミドルウェア
koaRouter.param('userName', (id, ctx, next) => {
    
    
  console.log('404');
  return next();
})

8. router.allowedMethods()

関数をミドルウェア形式で返します。

router.allowedMethods([options])
パラメータ タイプ 説明
オプション 物体
オプション.trow ブール値 ステータスとヘッダーを設定する代わりにエラーをスローします
options.notImplemented 関数 戻り値をスローしてデフォルトの NotImplemented エラーを置き換えます
options.methodNotAllowed 関数 戻り値をスローしてデフォルトの MethodNotAllowed エラーを置き換えます

github-ドキュメント

おすすめ

転載: blog.csdn.net/qq_36968599/article/details/119537245