iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON
时间:2022-05-06
本文章向大家介绍iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON,主要内容包括JSON 数据、提取中间件、应用中间件、中间件迁移、推荐: 翻译项目Master的自述:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
视频地址:https://www.cctalk.com/v/15114923886141
JSON 数据
我颠倒了整个世界,只为摆正你的倒影。
前面的文章中,我们已经完成了项目中常见的问题,比如 路由请求
、结构分层
、视图渲染
、静态资源
等。
那么,JSON
呢?JSON
格式数据的传输,已经深入到了我们的码里行间,脱离了 JSON
的人想必是痛苦的。那么,复合吧!
如何设置 JSON 格式
伟大的武术家——李小龙先生——说过这样一段话:
Empty your mind, Be formless,shapeless like water.
You put water in a cup, it becomes the cup.
You put water in a bottle, it becomes the bottle.
You put water in a teapot , it becomes the teapot.
Water can flow or crash.
翻译成中文意思就是:
清空你的思想,像水一样无形。
你将水倒入水杯,水就是水杯的形状。
你将水倒入瓶子,水就是瓶子的形状。
你将水倒入茶壶,水就是茶壶的形状。
你看,水会流动,也会冲击。
在数据传输过程中,传输的资源都可以称之为『数据』,而『数据』之所以展示出不同的形态,是因为我们已经设置了它的格式。
传输的数据像是『水』一样,没有任何的格式和形状。
我们的设置像是『器』一样,赋予它指定的形态。
所以,我们只需要设置把数据挂载在响应体 body
上,同时告诉客户端『返回的是 JSON
数据』,客户端就会按照 JSON
来解析了。代码如下:
ctx.set("Content-Type", "application/json")
ctx.body = JSON.stringify(json)
提取中间件
我们把上面的代码提取成一个中间件,这样更方便代码的维护性和扩展性
增加文件 /middleware/mi-send/index.js
:
module.exports = () => {
function render(json) {
this.set("Content-Type", "application/json")
this.body = JSON.stringify(json)
}
return async (ctx, next) => {
ctx.send = render.bind(ctx)
await next()
}
}
注意: 目录不存在,需要自己创建。
代码中,我们把 JSON
数据的处理方法挂载在 ctx
对象中,并起名为 send
。当我们需要返回 JSON
数据给客户端时候,只需要调用此方法,并把 JSON
对象作为参数传入到方法中就行了,用法如下:
ctx.send({
status: 'success',
data: 'hello ikcmap'
})
应用中间件
代码的实现过程和调用方法我们已经知道了,现在我们需要把这个中间件应用在项目中。
- 增加文件
middleware/index.js
,用来集中调用所有的中间件:
const miSend = require('./mi-send')
module.exports = (app) => {
app.use(miSend())
}
- 修改
app.js
,增加中间件的引用
const Koa = require('koa')
const path = require('path')
const bodyParser = require('koa-bodyparser')
const nunjucks = require('koa-nunjucks-2')
const staticFiles = require('koa-static')
const app = new Koa()
const router = require('./router')
const middleware = require('./middleware')
middleware(app)
app.use(staticFiles(path.resolve(__dirname, "./public")))
app.use(nunjucks({
ext: 'html',
path: path.join(__dirname, 'views'),
nunjucksConfig: {
trimBlocks: true
}
}));
app.use(bodyParser())
router(app)
app.listen(3000, () => {
console.log('server is running at http://localhost:3000')
})
中间件迁移
随着项目的步步完善,将会产生有更多的中间件。我们把 app.js
中的中间件代码迁移到 middleware/index.js
中,方便后期维护扩展
- 修改
app.js
const Koa = require('koa')
const app = new Koa()
const router = require('./router')
const middleware = require('./middleware')
middleware(app)
router(app)
app.listen(3000, () => {
console.log('server is running at http://localhost:3000')
})
- 修改
middleware/index.js
const path = require('path')
const bodyParser = require('koa-bodyparser')
const nunjucks = require('koa-nunjucks-2')
const staticFiles = require('koa-static')
const miSend = require('./mi-send')
module.exports = (app) => {
app.use(staticFiles(path.resolve(__dirname, "../public")))
app.use(nunjucks({
ext: 'html',
path: path.join(__dirname, '../views'),
nunjucksConfig: {
trimBlocks: true
}
}));
app.use(bodyParser())
app.use(miSend())
}
后面我们还会开发更多的中间件,比如日志记录、错误处理等,都会放在 middleware/
目录下处理。
推荐: 翻译项目Master的自述:
1. 干货|人人都是翻译项目的Master
2. iKcamp出品微信小程序教学共5章16小节汇总(含视频)
- 使用dropwizard(3)-加入DI-dagger2
- 巧用shell生成数据库检查脚本 (74天)
- 【专业技术】OPENGL与EGL
- 在dropwizard中使用feign,使用hystrix
- 用python抓取淘宝评论
- 使用Dropwizard(2)-配置分类ConfiguredBundle
- Upgrade with the Gradle Wrapper, gradlew升级
- 使用swagger作为restful api的doc文档生成
- 面试机器学习、大数据岗位时遇到的各种问题
- 使用nginx代理跨域,使用nginx代理bing的每日一图
- Java Web基础入门
- Java中Optional使用注意事项
- 使用awk来解析dump文件 (73天)
- IntelIj IDEA运行JUnit Test OutOfMemoryError
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一文学会使用 CSS 中的 min(), max(), clamp() 以及它们的使用场景用例
- 5 个 JS 数组技巧可提高你的开发技能
- 一个有意思的方案:不借助后台和 JS ,只用 CSS 让一个列表编号倒序,你会怎么做?
- 关于MySQL LOAD DATA特性的利用与思考
- NHibernate 缓存
- 渗透测试 | 突破前端JS加密限制
- 使用 Task 简化异步编程
- Task 编程中的异常处理
- AngularJS 中的 factory、 service 和 provider
- 设计模式之适配器模式
- 设计模式之组合模式
- MvvmCross 框架中的数据绑定语法
- Vivado IP核锁定的解除方法
- Flutter Dojo设计之道——骚气的闪屏动画是如何实现的
- 数据处理 | pandas入门专题——离散化与one-hot