node-express框架本地模擬接口數據

GitHub項目地址:git@github.com:zhangying2345/simuLocDataVue.githtml

背景知識

簡單的express路由

路由是指如何定義應用的端點(URIs)以及如何響應客戶端的請求。node

// 匹配根路徑的請求
app.get('/', function (req, res) {
  res.send('root');
});

// 匹配 /about 路徑的請求
app.get('/about', function (req, res) {
  res.send('about');
});

// 匹配 /random.text 路徑的請求
app.get('/random.text', function (req, res) {
  res.send('random.text');
});

從本質上來講,一個 Express 應用就是在調用各類中間件。
中間件(Middleware) 是一個函數,它能夠訪問請求對象(request object (req)), 響應對象(response object (res)), 和 web 應用中處於請求-響應循環流程中的中間件,通常被命名爲 next 的變量。webpack

var app = express();

// 沒有掛載路徑的中間件,應用的每一個請求都會執行該中間件
app.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});

// 掛載至 /user/:id 的中間件,任何指向 /user/:id 的請求都會執行它
app.use('/user/:id', function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

// 路由和句柄函數(中間件系統),處理指向 /user/:id 的 GET 請求
app.get('/user/:id', function (req, res, next) {
  res.send('USER');
});

express.Router

可以使用 express.Router 類建立模塊化、可掛載的路由句柄。Router 實例是一個完整的中間件和路由系統,所以常稱其爲一個 「mini-app」。git

下面的實例程序建立了一個路由模塊,並加載了一箇中間件,定義了一些路由,而且將它們掛載至應用的路徑上。github

var express = require('express');
var router = express.Router();

// 該路由使用的中間件
router.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
});
// 定義網站主頁的路由
router.get('/', function(req, res) {
  res.send('Birds home page');
});
// 定義 about 頁面的路由
router.get('/about', function(req, res) {
  res.send('About birds');
});

module.exports = router;

而後在應用中加載路由模塊:web

var birds = require('./birds');
...
app.use('/birds', birds);

應用便可處理髮自 /birds 和 /birds/about 的請求,而且調用爲該路由指定的 timeLog 中間件。express

webpack-dev-server

webpack-dev-server 爲你提供了一個簡單的 web 服務器,而且可以實時從新加載(live reloading)。json

const path = require('path');
  const HtmlWebpackPlugin = require('html-webpack-plugin');
  const CleanWebpackPlugin = require('clean-webpack-plugin');

  module.exports = {
    entry: {
      app: './src/index.js',
      print: './src/print.js'
    },
    devtool: 'inline-source-map',
 +   devServer: {
 +     contentBase: './dist'
 +   },
    plugins: [
      new CleanWebpackPlugin(['dist']),
      new HtmlWebpackPlugin({
        title: 'Development'
      })
    ],
    output: {
      filename: '[name].bundle.js',
      path: path.resolve(__dirname, 'dist')
    }
  };

以上配置告知 webpack-dev-server,在 localhost:8080 下創建服務,將 dist 目錄下的文件,做爲可訪問文件。相似於經過 Express 內置的 express.static 託管靜態文件,例如圖片、CSS、JavaScript 文件等,經過文件路徑就能夠訪問文件了。api

  • devServer.before

提供在服務器內部的全部其餘中間件以前執行定製中間件的功能。 這能夠用來定義自定義處理程序,例如:服務器

app.get('/some/path', function(req, res) {
    res.json({ custom: 'response' });
  });
}

webpack-dev-middleware

webpack-dev-middleware 是一個容器(wrapper),它能夠把 webpack 處理後的文件傳遞給一個服務器(server)。 webpack-dev-server 在內部使用了它。

模擬數據基本原理

  1. 讀取本地全部json文件的相對路徑
  2. require這些相對路徑讀取文件內容
  3. 把讀取到的內容所有放到一個json文件中
  4. 對每一個本文件中的url路徑設置express的路由監聽
  5. 監聽到的每一個路徑採用res.send返回結果,結果是經過url對應的key去往步驟3的json文件中去取對應的對象
var glob = require('glob');
const express = require('express')
const app = express()
var apiRoutes = express.Router()
var appData = require('../data/config')
var getApi= appData['get'];//全部的get請求
console.log('-----',getApi);
var postApi= appData['post'];//全部的post請求

//查找全部的json文件
var entryJS = {};
/*https://www.mgenware.com/blog/?p=2716---使用特殊的**來遞歸返回全部子目錄內的文件,由於默認node-glob只會返回一級子目錄下得內容。*/
let jsonFilesList = glob.sync('./data/**/*.json');
console.log('jsonFilesList-----',jsonFilesList);
/*獲取全部json文件的相對路徑(相對於本文件)))*/
entryJS = jsonFilesList.reduce(function (prev, curr) {
  console.log('curr------',curr);
  console.log('curr.slice(7)------',curr.slice(7));
  console.log('prev[curr.slice(7)---------',prev[curr.slice(7)]);
  prev[curr.slice(7)] = '.'+curr;
  console.log('prev---',prev);
  return prev;
}, {});

//合併全部的json文件到一個json中
let jsonData={};
for (var i in entryJS){
  console.log('entryJS-----',entryJS);
  let data = require(entryJS[i]);
  jsonData = Object.assign(jsonData, data);
  console.log('jsonData----->',jsonData);
}
console.log('jsonData--All--->',jsonData);
app.use('/', apiRoutes)

而後在devServer中添加

before (app) {
      //get//
      for(var i = 0;i < getApi.length; i++){
        console.log('getApi------->',getApi);
        var getData = jsonData[getApi[i].key];
        console.log('getData----->',getData);
        app.get(getApi[i].url, function (req, res) {
          res.json(getData);
        });
      }
      //post
      /*for(var i = 0;i < postApi.length; i++){
        var postData = jsonData[postApi[i].key];
        app.post(postApi[i].url,function (req, res) {
          res.json(postData);
        });
      }*/
    }
    ////////////////////////////

config.js中

let data={
  "get":[
    {
      'url':'/api/goods',
      'key':'goods'
    },
    {
      'url':'/api/sells',
      'key':'sells'
    }
  ],
  "post":[{
    'url':'api/sell',
    'key':'sells'
  }]
}
module.exports = data;

就能夠模擬本地數據了。

相關文章
相關標籤/搜索