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