koa深入

    科技2025-02-13  19

    1.安装(使用脚手架) 2.介绍路由 3.中间件机制

    1.安装(使用脚手架)

    // 全局安装koa脚手架 npm i koa-generator -g //创建koa项目 koa2 项目名 //npm install & npm run dev

    设置环境变量

    npm i cross-env --save-dev

    package.json

    { "name": "server", "version": "0.1.0", "private": true, "scripts": { "start": "node bin/www", "dev": "./node_modules/.bin/nodemon bin/www", "prd": "pm2 start bin/www", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { "debug": "^4.1.1", "koa": "^2.7.0", "koa-bodyparser": "^4.2.1", "koa-convert": "^1.2.0", "koa-json": "^2.0.2", "koa-logger": "^3.2.0", "koa-onerror": "^4.1.0", "koa-router": "^7.4.0", "koa-static": "^5.0.0", "koa-views": "^6.2.0", "pug": "^2.0.3" }, "devDependencies": { "cross-env": "^7.0.2", "nodemon": "^1.19.1" } }

    在script中的dev和pro中分别添加上开发环境和生成环境。

    "dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www", "prd": "cross-env NODE_ENV=production pm2 start bin/www",

    2.介绍路由

    post请求

    routes/login.js

    const router = require('koa-router')() router.prefix('/login') router.post('/', async function (ctx, next) { const { username, password } = ctx.request.body ctx.body = { username, password } }) module.exports = router

    在app.js中引入此路由文件及注册

    const Koa = require('koa') const app = new Koa() const views = require('koa-views') const json = require('koa-json') const onerror = require('koa-onerror') const bodyparser = require('koa-bodyparser') const logger = require('koa-logger') const index = require('./routes/index') const users = require('./routes/users') const login = require('./routes/login') // error handler onerror(app) // middlewares app.use(bodyparser({ enableTypes:['json', 'form', 'text'] })) app.use(json()) app.use(logger()) app.use(require('koa-static')(__dirname + '/public')) app.use(views(__dirname + '/views', { extension: 'pug' })) // logger app.use(async (ctx, next) => { const start = new Date() await next() const ms = new Date() - start console.log(`${ctx.method} ${ctx.url} - ${ms}ms`) }) // routes app.use(index.routes(), index.allowedMethods()) app.use(users.routes(), users.allowedMethods()) app.use(login.routes(), login.allowedMethods()) // error-handling app.on('error', (err, ctx) => { console.error('server error', err, ctx) }); module.exports = app

    新建登陆路由,前缀是/login,通过ctx.request.body获取post请求传过来的值。 由于使用了koa-body-parser,可直接通过ctx.request.body获取。原因请看《koa基础知识梳理巩固2》 get请求 routes/list.js

    const router = require('koa-router')() router.prefix('/list') router.get('/', function (ctx, next) { const query = ctx.query ctx.body = { query } }) module.exports = router

    通过ctx.query获取get请求参数。

    3.中间件机制

    有很多app.use()代码中的 next 参数是什么?

    app.use就是注册中间件,next是下一个中间件。

    // logger app.use(async (ctx, next) => { const start = new Date() await next() const ms = new Date() - start console.log(`${ctx.method} ${ctx.url} - ${ms}ms`) })
    Processed: 0.010, SQL: 8