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 つのタイプに分類されます。
- 静的リソース: 画像、スタイル ファイル、スクリプト ファイルなど。
- 動的リソース: データベース内で検索する必要があるリソース。
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 つだけある場合、ルート パラメータは文字列にすることができます。
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()
取得インターフェイスにリダイレクトします。
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 エラーを置き換えます |