前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON

iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON

作者头像
iKcamp
发布2018-03-30 12:40:29
1.2K0
发布2018-03-30 12:40:29
举报
文章被收录于专栏:iKcampiKcamp

视频地址:https://www.cctalk.com/v/15114923886141

JSON 数据

我颠倒了整个世界,只为摆正你的倒影。

前面的文章中,我们已经完成了项目中常见的问题,比如 路由请求结构分层视图渲染静态资源等。 那么,JSON 呢?JSON 格式数据的传输,已经深入到了我们的码里行间,脱离了 JSON 的人想必是痛苦的。那么,复合吧!

如何设置 JSON 格式

伟大的武术家——李小龙先生——说过这样一段话:

代码语言:javascript
复制
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. 

翻译成中文意思就是:

代码语言:javascript
复制
清空你的思想,像水一样无形。
你将水倒入水杯,水就是水杯的形状。
你将水倒入瓶子,水就是瓶子的形状。
你将水倒入茶壶,水就是茶壶的形状。
你看,水会流动,也会冲击。

在数据传输过程中,传输的资源都可以称之为『数据』,而『数据』之所以展示出不同的形态,是因为我们已经设置了它的格式。

传输的数据像是『水』一样,没有任何的格式和形状。

我们的设置像是『器』一样,赋予它指定的形态。

所以,我们只需要设置把数据挂载在响应体 body 上,同时告诉客户端『返回的是 JSON 数据』,客户端就会按照 JSON 来解析了。代码如下:

代码语言:javascript
复制
ctx.set("Content-Type", "application/json")
ctx.body = JSON.stringify(json)

提取中间件

我们把上面的代码提取成一个中间件,这样更方便代码的维护性和扩展性

增加文件 /middleware/mi-send/index.js

代码语言:javascript
复制
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 对象作为参数传入到方法中就行了,用法如下:

代码语言:javascript
复制
ctx.send({
  status: 'success',
  data: 'hello ikcmap'
})

应用中间件

代码的实现过程和调用方法我们已经知道了,现在我们需要把这个中间件应用在项目中。

  1. 增加文件 middleware/index.js,用来集中调用所有的中间件:
代码语言:javascript
复制
const miSend = require('./mi-send')
module.exports = (app) => {
  app.use(miSend())
}
  1. 修改 app.js,增加中间件的引用
代码语言:javascript
复制
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 中,方便后期维护扩展

  1. 修改 app.js
代码语言:javascript
复制
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')
})
  1. 修改 middleware/index.js
代码语言:javascript
复制
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小节汇总(含视频)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • JSON 数据
    • 如何设置 JSON 格式
      • 提取中间件
        • 应用中间件
          • 中间件迁移
            • 推荐: 翻译项目Master的自述:
              • 1. 干货|人人都是翻译项目的Master
              • 2. iKcamp出品微信小程序教学共5章16小节汇总(含视频)
          相关产品与服务
          消息队列 TDMQ
          消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档