koa框架的基本使用

1.Koa介绍

Koa 是基于 Node.js 平台的下一代 web 开发框架。

Koa是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 使用 Koa 编写 web 应用,可以免除重复繁琐的回调函数嵌套, 并极大地提升错误处理的效率。Koa不在内核方法中绑定任何中间件, 它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手,开发思路和 Express 差不多,最大的特点就是可以避免异步嵌套

2.Koa的安装和基本使用

 

(1)koa的基本使用:

// 引入Koa
var koa = require('koa');
// 实例化Koa
var app = new koa();
 
app.use( async(ctx)=>{
    ctx.body = "hello,koa"
});
 
// 监听端口
app.listen(3000);

(2)koa路由的使用:

// 1.安装 npm install --save koa-router
 
var Koa = require('koa');
// 2.引入路由并实例化
var Router = require('koa-router');
var app = new Koa();
var router = new Router();
 
// 路由路径前缀设置
router.prefix('/api')

// 3.配置路由
router.get('/get', async (ctx) => { // 路径: /api/get
    // 返回数据给前端
    ctx.body = "返回响应数据";
});
 
// 4.启动路由(来自于官方文档);
// router.allowedMethods()可以配置也可以不配置。
// 如果之前的没有设置响应头,配置此选项以后可以自动设置响应头。
app.use(router.routes()).use(router.allowedMethods());
 
// 监听端口
app.listen(3000);

(3)Koa中间件

中间件是配合路由匹配完成做的一系列的操作,我们就可以把它叫做中间件。Koa中运用中间件可以实现以下一些功能:

(1).添加应用。主要通过app.use()这个函数添加或是启动一些应用,如常见的一些第三方中间件的使用。
(2)匹配路由。主要通过next()这个函数完成多级路由匹配。
(3)错误处理。如果当前访问的路由一直向下匹配没有匹配到,可以通过中间件给出错误响应。

var Koa = require('koa');
var Router = require('koa-router');
var app = new Koa();
var router = new Router();
// Koa 错误处理中间件
// 无论app.use放到路由前面还是后面
// 都是先执行app.use再去执行路由
app.use(async (ctx, next) => {
    console.log('这是一个中间件');       // 执行顺序1
    await next();
    if (ctx.status == 404) {           // 执行顺序3
        ctx.body = '这是一个404页面';
    } else {
        console.log(ctx.url);
    }
});
// 配置新闻页                            // 执行顺序2
router.get('/news', async (ctx, next) => {
    console.log('这是新闻路由');
    await next();
});
 
app.use(router.routes());
app.use(router.allowedMethods());
 
app.listen(3000);

(4)使用koa-body和@koa/cors

介绍:
koa-body  //处理request过来的请求里面的数据
@koa/cors  //处理一些跨域请求

安装:

npm install -S koa-body @koa/cors

使用:

(5)Koa中post传值的获取

var Koa = require('koa');
var Router = require('koa-router');
var cors = require('@koa/cors');
var koabody = require('koa-body');

var app = new Koa();
var router = new Router();

router.post('/post', async (ctx, next) => {
    let {body}=ctx.request;//获取前端给的值
    ctx.body={//把body里面前端给的内容再返回给前端
        ...body
    }
});

//app.use注意顺序
app.use(koaBody())//处理request过来的请求里面的数据
app.use(cors())//处理一些跨域请求

app.use(router.routes())
    .use(router.allowedMethods());
 
app.listen(3000);

(6)Koa中get传值及获取get传值

Koa中的get传值主要有以下两种方式:

(1).键值对拼接传参,接收参数主要通过ctx.qruery获取,需要注意的是在ctx与ctx.request里均可以获得一样的结果。

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();
// http://localhost:3000/details?id=1&name=jiangyx
router.get('/details',async(ctx)=>{
    // 从ctx中读取Get传值
    console.log(ctx.url);// /details?id=1&name=jiangyx
    console.log(ctx.query); // { id: '1', name: 'jiangyx' } // 获取的是对象,用的最多的方式
    console.log(ctx.querystring) // id=1&name=jiangyx // 获取的是字符串
 
    // 从ctx里的request里获取Get传值
    console.log(ctx.request.url); // /details?id=1&name=jiangyx
    console.log(ctx.request.query); // { id: '1', name: 'jiangyx' }
    console.log(ctx.request.querystring); // id=1&name=jiangyx
});
 
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);

(2).动态路由传参,接收参数主要通过ctx.params获取。

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();
 
// http://localhost:3000/details/1/jiangyx
router.get('/details/:id/:name', async (ctx) => {
    // 获取动态路由的传值
    console.log(ctx.params); // { id: '1' ,name:'jiangyx'}
});
 
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);

(7)koa-json的使用

介绍:按照json格式数据的传输

安装:

npm install -S koa-json

使用:

。。。。。
var json = require('koa-json');
。。。。。

app.use(json({ pretty: false, param: 'pretty' }));
。。。。



//案例:

http://localhost:3000/details?id=1&name=jiangyx
返回结果:{"foo":"bar"}

路径加pretty
http://localhost:3000/details?id=1&name=jiangyx&pretty
返回结果:
{
  "foo": "bar"
}

(8)合并路由(路由压缩):koa-combine-routers

// 安装:npm install koa-combine-routers

// app.js
const Koa = require('koa')
const router = require('./routes')
 
const app = new Koa()
 
app.use(router())


// routers.js
const Router = require('koa-router')
const combineRouters = require('koa-combine-routers')
 
const dogRouter = new Router()
const catRouter = new Router()
 
dogRouter.get('/dogs', async ctx => {
  ctx.body = 'ok'
})
 
catRouter.get('/cats', async ctx => {
  ctx.body = 'ok'
})
 
const router = combineRouters(
  dogRouter,
  catRouter
)
 
module.exports = router

(9)加入安全头:koa-helmet

安装:npm install koa-helmet -S

使用:
const Koa = require("koa");
const helmet = require("koa-helmet");
const app = new Koa();
 
app.use(helmet());
 
app.use((ctx) => {
  ctx.body = "Hello World"
});
 
app.listen(4000);

(10)静态资源:koa-static

安装:npm install -S koa-static

使用:
const serve = require('koa-static');
const Koa = require('koa');
const app = new Koa();
 
// $ GET /package.json
app.use(serve('.'));
 
// $ GET /hello.txt
app.use(serve('test/fixtures'));
 
// or use absolute paths
app.use(serve(__dirname + '/test/fixtures'));
 
app.listen(3000);
 
console.log('listening on port 3000');

(11)使用koa-compose集成中间件

import koa from 'koa'
import path from 'path'
import helmet from 'koa-helmet'
import statics from 'koa-static'
import router from './routes/routes'//合并路由后的routers.js
import koaBody from 'koa-body'
import jsonutil from 'koa-json'
import cors from '@koa/cors'
import compose from 'koa-compose'

const app = new koa()

// app.use...
// app.use(helmet()) 
// app.use(statics(path.join(__dirname, '../public')))
// app.use(router())
const middleware = compose([
    koaBody(),
    statics(path.join(__dirname,'../public')),
    cors(),
    jsonutil({pretty: false, param:'pretty'}),
    helmet()
])

app.use(middleware)
app.use(router())

app.listen(3000);

(12)koa-compress压缩数据

import koa from 'koa'
import path from 'path'
import helmet from 'koa-helmet'
import statics from 'koa-static'
import router from './routes/routes'//合并路由后的routers.js
import koaBody from 'koa-body'
import jsonutil from 'koa-json'
import cors from '@koa/cors'
import compose from 'koa-compose'
import compress from 'koa-compress'


const app = new koa()

const isDevMode=process.env.NODE_ENV==='production'?false:true

const middleware = compose([
    koaBody(),
    statics(path.join(__dirname,'../public')),
    cors(),
    jsonutil({pretty: false, param:'pretty'}),
    helmet()
])

if(!isDevMode){
    app.use(compress())
}

app.use(middleware)
app.use(router())

app.listen(3000);

(13)nodemon

nodemon是一种工具,可以自动检测到目录中的文件更改时通过重新启动应用程序来调试基于node.js的应用程序。

// 安装
npm install -g nodemon
//或
npm install --save-dev nodemon


// 使用
nodemon   ./main.js // 启动node服务
nodemon ./main.js localhost 6677 // 在本地6677端口启动node服务
"start": "nodemon src/main.ts",//在package.json中使用

nodemon是利用common.js语法执行的进行监视的,我们如何支持es6的语法进行监视执行呢?

"start": "nodemon --exec babel-node src/main.ts",

(14)Koa操作MySQL数据库

// 1.npm install --save mysql
 
// 2.引入模块
const mysql = require('mysql');
 
// 3.连接数据库
const connection = mysql.createConnection({
    host: '127.0.0.1',         // 数据库地址
    user: 'root',              // 用户名 
    password: '123456' ,       // 密码   
    database: 'my_data'        // 数据库名称   
})
 
// 4.执行sql语句操作数据库
connection.query('SELECT * FROM user',
     (error, results, fields) => {
        if (error) {
            console.log(error)
        };
        // 操作数据
 
        // 结束会话
        connection.release();
    }
);
 

注意,数据库会话操作执行完后,需要关闭掉,以免占用连接资源。

当有多个会话需要操作数据库时,为了避免每次会话都要重新连接,所以这时候就需要连接池管理会话。

// 1.npm install --save mysql
 
// 2.引入模块
const mysql = require('mysql');
 
// 3.创建数据池
const pool = mysql.createPool({
    host: '127.0.0.1',         // 数据库地址
    user: 'root',              // 用户名 
    password: '123456',        // 密码   
    database: 'my_data'        // 数据库名称 
})
 
// 4.在数据池中进行会话操作
pool.getConnection(function (err, connection) {
    // 5.执行sql语句操作数据库
    connection.query('SELECT * FROM user', 
        (error, results, fields) => {
        
            // 执行操作
 
            // 释放连接
            connection.release();
            // 如果有错误就抛出
            if (error) {
                throw error;
            }
        }
    )
})
 

(15)断点调试

nodejs在Chrome 中断点调试:https://blog.csdn.net/xiasohuai/article/details/90551504

nodejs在vscode 中断点调试:https://blog.csdn.net/xiasohuai/article/details/90551380

webpack打包过程如何调试(浏览器):https://blog.csdn.net/xiasohuai/article/details/107889879

 

 

 

 

 

 

 

Koa 框架使用注解需要借助于 TypeScript,因为注解本身就是 TypeScript 中的一种特性。具体步骤如下: 1. 安装依赖: ```bash npm install reflect-metadata npm install @koa/router npm install koa-bodyparser npm install typescript npm install ts-node ``` 2. 在 tsconfig.json 中启用 decorator 和 emitDecoratorMetadata: ```json { "compilerOptions": { "target": "es6", "module": "commonjs", "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true } } ``` 3. 创建一个 Koa 应用,并且使用 koa-router 和 koa-bodyparser: ```typescript import Koa from 'koa'; import Router from '@koa/router'; import bodyParser from 'koa-bodyparser'; const app = new Koa(); const router = new Router(); app.use(bodyParser()); app.use(router.routes()); ``` 4. 创建一个控制器类,使用 @Controller 装饰器标记该类,并使用 @Route 装饰器标记该类中的方法对应的路由: ```typescript import { Controller, Route } from './decorators'; @Controller('/api') class ApiController { @Route('get', '/hello') async sayHello(ctx: Koa.Context) { ctx.body = 'Hello, world!'; } } ``` 5. 创建一个装饰器文件 decorators.ts,包含 @Controller 和 @Route 装饰器: ```typescript import 'reflect-metadata'; import Router from '@koa/router'; const CONTROLLER_KEY = Symbol('controller'); const ROUTES_KEY = Symbol('routes'); export function Controller(path: string) { return function(target: any) { Reflect.defineMetadata(CONTROLLER_KEY, path, target); } } export function Route(method: string, path: string) { return function(target: any, key: string) { if (!Reflect.hasMetadata(ROUTES_KEY, target.constructor)) { Reflect.defineMetadata(ROUTES_KEY, [], target.constructor); } const routes = Reflect.getMetadata(ROUTES_KEY, target.constructor); routes.push({ method, path, key }); } } export function registerRoutes(router: Router) { const controllers = Reflect.getMetadata(CONTROLLER_KEY, Reflect) || []; controllers.forEach((controller: any) => { const routes = Reflect.getMetadata(ROUTES_KEY, controller) || []; routes.forEach((route: any) => { router[route.method](controller.path + route.path, controller[route.key]); }); }); } ``` 6. 在入口文件中注册路由: ```typescript import { registerRoutes } from './decorators'; registerRoutes(router); app.listen(3000); ``` 以上就是在 Koa 框架使用注解的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值