<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          5分鐘教你用nodeJS手寫一個(gè)mock數(shù)據(jù)服務(wù)

          共 4311字,需瀏覽 9分鐘

           ·

          2021-09-16 15:28

          關(guān)注并將「趣談前端」設(shè)為星標(biāo)

          每天定時(shí)分享技術(shù)干貨/優(yōu)秀開源/技術(shù)思維

          對(duì)于前端開發(fā)者而言,javascript正扮演著越來越重要的地位,它不僅能為瀏覽器端賦能,在web服務(wù)器方面也有很大的價(jià)值(我們可以用nodeJS來寫服務(wù)端代碼,啟動(dòng)web服務(wù)器),因此本文所要描述的,便是javascript在服務(wù)端的應(yīng)用。我將介紹如何使用nodeJS來搭建一個(gè)mock服務(wù)器,方便前端自定義mock數(shù)據(jù)請(qǐng)求,提高前端開發(fā)著的主觀能動(dòng)性和對(duì)項(xiàng)目健壯性的探索。

          我們將學(xué)到

          • koa基本使用
          • koa-router的基本用法
          • koa-logger的使用
          • glob支持文件遍歷查尋
          • node幾個(gè)核心api的使用
          • 使用nodemon做自動(dòng)重啟

          mock服務(wù)器基本設(shè)計(jì)思路

          通過目錄路徑和服務(wù)端api的映射關(guān)系來實(shí)現(xiàn)我們的api訪問,比如我們?cè)L問接口/api/article/122,我們只需要在mock服務(wù)期目錄的api的article目錄下,創(chuàng)建122.json文件即可,json文件的數(shù)據(jù)可以自定義,方便前端調(diào)試。

          具體實(shí)現(xiàn)

          1.搭建一個(gè)node服務(wù)

          const Koa = require('koa');
          const app = new Koa();
          app.listen(3000)

          2.注冊(cè)路由 我們使用koa-router來實(shí)現(xiàn)后臺(tái)服務(wù)的路由功能,并通過koa提供的上下文ctx將讀取到的數(shù)據(jù)返回給前端:

          const Koa = require('koa');
          const Router = require('koa-router');
           
          const app = new Koa();
          const router = new Router({prefix'/api'});

          router.get('/name', (ctx, next) => {
              ctx.body = {
                  name'xuxiaoxi'
              }
            });

          app
            .use(router.routes())
            .use(router.allowedMethods());
            
          app.listen(3000)

          這樣我們就能實(shí)現(xiàn)一個(gè)勉強(qiáng)能用的基本的后臺(tái)api服務(wù)器了,當(dāng)我們請(qǐng)求/api/name時(shí),會(huì)返回相應(yīng)的數(shù)據(jù)給前臺(tái),這一步是我們實(shí)現(xiàn)mock服務(wù)的關(guān)鍵一步,接下來我們具體來實(shí)現(xiàn)目錄的遍歷和api的自動(dòng)注冊(cè)。

          3.自動(dòng)注冊(cè)api接口并返回?cái)?shù)據(jù) 我們將在這個(gè)階段實(shí)現(xiàn)api服務(wù)的自動(dòng)注冊(cè),這里我們使用glob這個(gè)第三方模塊來遍歷目錄,并通過node的fs模塊讀取api文件的數(shù)據(jù)并返回給前臺(tái)。glob的使用很簡單,感興趣的朋友可以自行學(xué)習(xí),這里就不做過多介紹了。具體實(shí)現(xiàn)如下:

          const Koa = require('koa');
          const Router = require('koa-router');
          const glob = require("glob");
          const { resolve } = require('path');
          const fs = require('fs');
           
          const app = new Koa();
          const router = new Router({prefix'/api'});

          // 注冊(cè)路由
          glob.sync(resolve('./api'"**/*.json")).forEach((item, i) => {
              let apiJsonPath = item && item.split('/api')[1];
              let apiPath = apiJsonPath.replace('.json''');
              
              router.get(apiPath, (ctx, next) => {
                  try {
                      let jsonStr = fs.readFileSync(item).toString();
                      ctx.body = {
                          dataJSON.parse(jsonStr),
                          state200,
                          type'success' // 自定義響應(yīng)體
                      }
                  }catch(err) {
                      ctx.throw('服務(wù)器錯(cuò)誤'500);
                  }
                });
          });
           
          app
            .use(router.routes())
            .use(router.allowedMethods());

          app.listen(3000);

          1. 添加控制臺(tái)日志 我們使用koa-logger實(shí)現(xiàn)在終端打印node日志,方便調(diào)試,雖然這不是該文章的重點(diǎn),但是對(duì)于想做node開發(fā)的前端從業(yè)者,還是很有必要了解的。
          const logger = require('koa-logger')
          app.use(logger());

          這樣,我們每個(gè)請(qǐng)求都會(huì)在終端打印出來。

          1. 路由映射文件的生成 該功能也不是本文的重點(diǎn),但是會(huì)極大的方便前端開發(fā)者調(diào)試請(qǐng)求,因?yàn)槿绻鸻pi路徑很長,我們需要一個(gè)個(gè)查找,但是有了這個(gè)map文件,我們只需要拷貝自動(dòng)生成的路徑即可。具體實(shí)現(xiàn)如下:
          //...
          const routerMap = {};  // 存放路由映射

          // 注冊(cè)路由
          glob.sync(resolve('./api'"**/*.json")).forEach((item, i) => {
              // ...
              
              // 記錄路由
              routerMap[apiJsonPath] = apiPath;
          });

          fs.writeFile('./routerMap.json'JSON.stringify(routerMap, null , 4), err => {
              if(!err) {
                  console.log('路由地圖生成成功!')
              }
          });

          基本目錄結(jié)構(gòu)

          github地址:

          https://github.com/MrXujiang/openCoder/tree/master/mockServer

          歡迎大家相互學(xué)習(xí)交流,一起探索前端的邊界。


          點(diǎn)個(gè)在看你最好看

          瀏覽 53
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文 无码 日韩 | 欧美精品一区二区三区四区 | 国产深喉视频 | 啪啪啪国产网站 | 国产操逼视频免费看 |