視頻地址:https://www.cctalk.com/v/15114923886141
JSON 數(shù)據(jù)我顛倒了整個(gè)世界,只為擺正你的倒影。
前面的文章中,我們已經(jīng)完成了項(xiàng)目中常見的問題,比如 路由請(qǐng)求、結(jié)構(gòu)分層、視圖渲染、靜態(tài)資源等。
那么,JSON 呢?JSON 格式數(shù)據(jù)的傳輸,已經(jīng)深入到了我們的碼里行間,脫離了 JSON 的人想必是痛苦的。那么,復(fù)合吧!
偉大的武術(shù)家——李小龍先生——說過這樣一段話:
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.
翻譯成中文意思就是:
清空你的思想,像水一樣無形。 你將水倒入水杯,水就是水杯的形狀。 你將水倒入瓶子,水就是瓶子的形狀。 你將水倒入茶壺,水就是茶壺的形狀。 你看,水會(huì)流動(dòng),也會(huì)沖擊。
在數(shù)據(jù)傳輸過程中,傳輸?shù)馁Y源都可以稱之為『數(shù)據(jù)』,而『數(shù)據(jù)』之所以展示出不同的形態(tài),是因?yàn)槲覀円呀?jīng)設(shè)置了它的格式。
傳輸?shù)臄?shù)據(jù)像是『水』一樣,沒有任何的格式和形狀。
我們的設(shè)置像是『器』一樣,賦予它指定的形態(tài)。
所以,我們只需要設(shè)置把數(shù)據(jù)掛載在響應(yīng)體 body 上,同時(shí)告訴客戶端『返回的是 JSON 數(shù)據(jù)』,客戶端就會(huì)按照 JSON 來解析了。代碼如下:
ctx.set("Content-Type", "application/json") ctx.body = JSON.stringify(json)提取中間件
我們把上面的代碼提取成一個(gè)中間件,這樣更方便代碼的維護(hù)性和擴(kuò)展性
增加文件 /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() } }
注意: 目錄不存在,需要自己創(chuàng)建。
代碼中,我們把 JSON 數(shù)據(jù)的處理方法掛載在 ctx 對(duì)象中,并起名為 send。當(dāng)我們需要返回 JSON 數(shù)據(jù)給客戶端時(shí)候,只需要調(diào)用此方法,并把 JSON 對(duì)象作為參數(shù)傳入到方法中就行了,用法如下:
ctx.send({ status: "success", data: "hello ikcmap" })應(yīng)用中間件
代碼的實(shí)現(xiàn)過程和調(diào)用方法我們已經(jīng)知道了,現(xiàn)在我們需要把這個(gè)中間件應(yīng)用在項(xiàng)目中。
增加文件 middleware/index.js,用來集中調(diào)用所有的中間件:
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") })中間件遷移
隨著項(xiàng)目的步步完善,將會(huì)產(chǎn)生有更多的中間件。我們把 app.js 中的中間件代碼遷移到 middleware/index.js 中,方便后期維護(hù)擴(kuò)展
修改 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()) }
后面我們還會(huì)開發(fā)更多的中間件,比如日志記錄、錯(cuò)誤處理等,都會(huì)放在 middleware/ 目錄下處理。
下一篇:記錄日志——開發(fā)日志中間件,記錄項(xiàng)目中的各種形式信息
上一篇:iKcamp新課程推出啦~~~~~iKcamp|基于Koa2搭建Node.js實(shí)戰(zhàn)(含視頻)? 處理靜態(tài)資源推薦: 翻譯項(xiàng)目Master的自述: 1. 干貨|人人都是翻譯項(xiàng)目的Master 2. iKcamp出品微信小程序教學(xué)共5章16小節(jié)匯總(含視頻)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/92505.html
摘要:玩轉(zhuǎn)同時(shí)全面掌握潮流技術(shù)采用新一代的開發(fā)框架更小更富有表現(xiàn)力更健壯。融合多種常見的需求場景網(wǎng)絡(luò)請(qǐng)求解析模板引擎靜態(tài)資源日志記錄錯(cuò)誤請(qǐng)求處理。結(jié)合語句中轉(zhuǎn)中間件控制權(quán),解決回調(diào)地獄問題。注意分支中的目錄為當(dāng)節(jié)課程后的完整代碼。 ?? ?與眾不同的學(xué)習(xí)方式,為你打開新的編程視角 獨(dú)特的『同步學(xué)習(xí)』方式 文案講解+視頻演示,文字可激發(fā)深層的思考、視頻可還原實(shí)戰(zhàn)操作過程。 云集一線大廠...
摘要:云集一線大廠有真正實(shí)力的程序員團(tuán)隊(duì)云集一線大廠經(jīng)驗(yàn)豐厚的碼農(nóng),開源奉獻(xiàn)各教程。融合多種常見的需求場景網(wǎng)絡(luò)請(qǐng)求解析模板引擎靜態(tài)資源日志記錄錯(cuò)誤請(qǐng)求處理。結(jié)合語句中轉(zhuǎn)中間件控制權(quán),解決回調(diào)地獄問題。注意分支中的目錄為當(dāng)節(jié)課程后的完整代碼。 ?? ?與眾不同的學(xué)習(xí)方式,為你打開新的編程視角 獨(dú)特的『同步學(xué)習(xí)』方式 文案講解+視頻演示,文字可激發(fā)深層的思考、視頻可還原實(shí)戰(zhàn)操作過程。 云...
POST/GET請(qǐng)求——常見請(qǐng)求方式處理 ?? iKcamp 制作團(tuán)隊(duì) 原創(chuàng)作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃 文案校對(duì):李益、大力萌、Au、DDU、小溪里、小哈 風(fēng)采主播:可木、阿干、Au、DDU、小哈 視頻剪輯:小溪里 主站運(yùn)營:給力xi、xty 教程主編:張利濤 視頻地址:https://www.cctalk.com/v/15114357765870 ...
安裝搭建項(xiàng)目的開發(fā)環(huán)境 視頻地址:https://www.cctalk.com/v/15114357764004 showImg(https://segmentfault.com/img/remote/1460000012470016?w=1214&h=718); 文章 Koa 起手 - 環(huán)境準(zhǔn)備 由于 koa2 已經(jīng)開始使用 async/await 等新語法,所以請(qǐng)保證 node 環(huán)境在 7.6...
滬江CCtalk視頻地址:https://www.cctalk.com/v/15114923887518 showImg(https://segmentfault.com/img/remote/1460000013096340?w=1282&h=714); 處理錯(cuò)誤請(qǐng)求 愛能遮掩一切過錯(cuò)。 當(dāng)我們?cè)谠L問一個(gè)站點(diǎn)的時(shí)候,如果訪問的地址不存在(404),或服務(wù)器內(nèi)部發(fā)生了錯(cuò)誤(500),站點(diǎn)會(huì)展示出某...
閱讀 1996·2021-11-19 09:40
閱讀 1951·2021-09-28 09:36
閱讀 2287·2021-09-22 10:02
閱讀 2730·2019-08-30 14:00
閱讀 1954·2019-08-29 15:31
閱讀 2902·2019-08-29 15:11
閱讀 2911·2019-08-29 13:04
閱讀 1084·2019-08-27 10:55