GitHub项目地址:git@github.com:zhangying2345/simuLocDataVue.git
背景知识
简单的express路由
路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。
// 匹配根路径的请求
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 的变量。
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”。
下面的实例程序创建了一个路由模块,并加载了一个中间件,定义了一些路由,并且将它们挂载至应用的路径上。
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;
然后在应用中加载路由模块:
var birds = require('./birds');
...
app.use('/birds', birds);
应用即可处理发自 /birds 和 /birds/about 的请求,并且调用为该路由指定的 timeLog 中间件。
webpack-dev-server
webpack-dev-server 为你提供了一个简单的 web 服务器,并且能够实时重新加载(live reloading)。
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 文件等,通过文件路径就可以访问文件了。
- 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 在内部使用了它。
模拟数据基本原理
- 读取本地所有json文件的相对路径
- require这些相对路径读取文件内容
- 把读取到的内容全部放到一个json文件中
- 对每个本文件中的url路径设置express的路由监听
- 监听到的每个路径采用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;
就可以模拟本地数据了。