总结自 Coderwhy的nodejs课程。
官网 koa.bootcss.com/#applicatio…
Koa的介绍
- node.js的下一代web框架;
- Koa旨在为Web应用程序和API提供更小、更丰富和更强大的能力;
- 相对于express具有更强的异步处理能力;
- Koa的核心代码只有1600+行,是一个更加轻量级的框架,我们可以根据需要安装和使用中间件;
Koa初体验
const Koa = require('koa'); const app = new Koa(); app.use((ctx, next) => { ctx.response.body = "Hello Koa"; }); app.listen(8000, () => { console.log("koa初体验服务器启动成功~"); });
通过上面的例子,我们来介绍一下中间件中的两个参数。
- ctx: 上下文(Context)对象;
- koa并没有像express一样,将req和res分开,而是将它们作为ctx的属性
ctx.req
为Node 的request
对象.
ctx.res
为Node 的response
对象.
ctx.response
为Koa 的response
对象.
ctx.request
为Koa 的request
对象.
- next: 终止该中间件使用,调用下一个中间件。
Koa中使用中间件
Koa中注册中间件只能通过use()
来注册,而且只能传递一个中间件,不能匹配路径。
app.use((ctx, next) => { ctx.response.body = "Hello Koa"; });
使用路由
由于koa中未给我们提供路由处理,如果想要做复杂的路由匹配,我们就需要安装第三方库来帮助我们处理路由。 安装koa-router
库。
注册路由
// users.js const Router = require('koa-router'); const userRouter = new Router({prefix: "/users"}); userRouter.get('/', (ctx, next) => { ctx.response.body = "User Lists~"; }); userRouter.put('/', (ctx, next) => { ctx.response.body = "put request~"; }); module.exports = userRouter;
使用路由
// index.js const Koa = require('koa'); const userRouter = require('./router/user'); const app = new Koa(); app.use(userRouter.routes()); app.use(userRouter.allowedMethods()); app.listen(8000, () => { console.log("koa路由服务器启动成功~"); });
从上面的例子可以看出
- 当如路由文件,在app中将
router.routes()
注册为中间件
router.allowedMethods()
: 他是用来判断我们设置了那些请求方法。如果只设置get请求,那么我们请求post,patch,delete等方法将会报错。Method Not Allowed,状态码:405;
解析请求传递的参数
解析params参数
我们直接通过ctx.request.params
就可以获取到。当未使用路由时,他不会被解析。因为他不知道怎么解析,未给出解析对应的键名。
const Koa = require('koa'); const app = new Koa(); const Router = require('koa-router'); const userRouter = new Router({ prefix: '/users' }); // http://127.0.0.1:8000/users/9?name=zh&age=20 userRouter.get('/:id', (ctx, next) => { console.log(ctx.request.url); console.log(ctx.request.params); console.log(ctx.request.query); /** * /users/9?name=zh&age=20 * { id: '9' } * [Object: null prototype] { name: 'zh', age: '20' } */ }) app.use(userRouter.routes()); app.listen(8000, () => { console.log("参数处理服务器启动成功~"); });
解析query参数
我们直接通过ctx.request.query
就可以获取到。
const Koa = require('koa'); const app = new Koa(); const Router = require('koa-router'); const userRouter = new Router({ prefix: '/users' }); // http://127.0.0.1:8000/users/9?name=zh&age=20 userRouter.get('/:id', (ctx, next) => { console.log(ctx.request.url); console.log(ctx.request.params); console.log(ctx.request.query); /** * /users/9?name=zh&age=20 * { id: '9' } * [Object: null prototype] { name: 'zh', age: '20' } */ }) app.use(userRouter.routes()); app.listen(8000, () => { console.log("参数处理服务器启动成功~"); });
解析请求中的json格式数据
Koa没有像Express中那样提供内置的中间件,所以我们需要使用第三方库koa-bodyparser
解析。将解析后的参数放在ctx.request.body
上。
const bodyParser = require('koa-bodyparser'); app.use((ctx, next) => { console.log("body===json", ctx.request.body); ctx.response.body = "Hello World"; });
解析请求中的x-www-from-urlencoded格式数据
Koa没有像Express中那样提供内置的中间件,所以我们需要使用第三方库koa-bodyparser
解析。将解析后的参数放在ctx.request.body
上。
const bodyParser = require('koa-bodyparser'); app.use((ctx, next) => { console.log("body===json", ctx.request.body); ctx.response.body = "Hello World"; });
解析请求中的form-data格式数据
他们的用法就等同于expres中的multer使用
我们需要安装koa-multer
库来帮助我们解析。这个库和Express中解析文件数据差不多。不要将它作为全局中间件来使用,上传文件和非文件的form-data格式的数据,可能会产生冲突。并且它将数据挂载到的是nodejs中的request.body
上的。通过ctx.req.body
获取
解析非文件的表单数据
const Koa = require('koa'); const Router = require('koa-router'); const multer = require('koa-multer'); const app = new Koa(); const uploadRouter = new Router({prefix: '/upload'}); const upload = multer(); uploadRouter.post('/', upload.any(), (ctx, next) => { console.log(ctx.req.body); ctx.response.body = "解析成功~"; }); app.use(uploadRouter.routes()); app.listen(8000, () => { console.log("koa初体验服务器启动成功~"); });
解析文件的表单数据
我们可以指定上传的文件名和后缀。也可以上系统自动分配文件名。
const Koa = require('koa'); const Router = require('koa-router'); const multer = require('koa-multer'); const app = new Koa(); const uploadRouter = new Router({prefix: '/upload'}); const uploadSingle = multer({ dest: './uploads/avatar' }); const uploadArray = multer({ dest: './uploads/picture' }); // 上传单个文件,而且他只能上传单文件。 uploadRouter.post('/avatar', uploadSingle.single('avatar'), (ctx, next) => { console.log(ctx.req.file); ctx.response.body = "上传头像成功~"; }); // 上传多个文件 uploadRouter.post('/picture', uploadArray.array('picture'), (ctx, next) => { console.log(ctx.req.files); ctx.response.body = "上传多文件成功~"; }); app.use(uploadRouter.routes()); app.listen(8000, () => { console.log("koa初体验服务器启动成功~"); });
网络异常,图片无法展示
|
网络异常,图片无法展示
|