摘要:下面的實(shí)例程序創(chuàng)建了一個(gè)路由模塊,并加載了一個(gè)中間件,定義了一些路由,并且將它們掛載至應(yīng)用的路徑上。該路由使用的中間件定義網(wǎng)站主頁(yè)的路由定義頁(yè)面的路由然后在應(yīng)用中加載路由模塊應(yīng)用即可處理發(fā)自和的請(qǐng)求,并且調(diào)用為該路由指定的中間件。
GitHub項(xiàng)目地址:git@github.com:zhangying2345/simuLocDataVue.git
背景知識(shí) 簡(jiǎn)單的express路由路由是指如何定義應(yīng)用的端點(diǎn)(URIs)以及如何響應(yīng)客戶端的請(qǐng)求。
// 匹配根路徑的請(qǐng)求 app.get("/", function (req, res) { res.send("root"); }); // 匹配 /about 路徑的請(qǐng)求 app.get("/about", function (req, res) { res.send("about"); }); // 匹配 /random.text 路徑的請(qǐng)求 app.get("/random.text", function (req, res) { res.send("random.text"); });
從本質(zhì)上來(lái)說(shuō),一個(gè) Express 應(yīng)用就是在調(diào)用各種中間件。
中間件(Middleware) 是一個(gè)函數(shù),它可以訪問(wèn)請(qǐng)求對(duì)象(request object (req)), 響應(yīng)對(duì)象(response object (res)), 和 web 應(yīng)用中處于請(qǐng)求-響應(yīng)循環(huán)流程中的中間件,一般被命名為 next 的變量。
var app = express(); // 沒(méi)有掛載路徑的中間件,應(yīng)用的每個(gè)請(qǐng)求都會(huì)執(zhí)行該中間件 app.use(function (req, res, next) { console.log("Time:", Date.now()); next(); }); // 掛載至 /user/:id 的中間件,任何指向 /user/:id 的請(qǐng)求都會(huì)執(zhí)行它 app.use("/user/:id", function (req, res, next) { console.log("Request Type:", req.method); next(); }); // 路由和句柄函數(shù)(中間件系統(tǒng)),處理指向 /user/:id 的 GET 請(qǐng)求 app.get("/user/:id", function (req, res, next) { res.send("USER"); });express.Router
可使用 express.Router 類創(chuàng)建模塊化、可掛載的路由句柄。Router 實(shí)例是一個(gè)完整的中間件和路由系統(tǒng),因此常稱其為一個(gè) “mini-app”。
下面的實(shí)例程序創(chuàng)建了一個(gè)路由模塊,并加載了一個(gè)中間件,定義了一些路由,并且將它們掛載至應(yīng)用的路徑上。
var express = require("express"); var router = express.Router(); // 該路由使用的中間件 router.use(function timeLog(req, res, next) { console.log("Time: ", Date.now()); next(); }); // 定義網(wǎng)站主頁(yè)的路由 router.get("/", function(req, res) { res.send("Birds home page"); }); // 定義 about 頁(yè)面的路由 router.get("/about", function(req, res) { res.send("About birds"); }); module.exports = router;
然后在應(yīng)用中加載路由模塊:
var birds = require("./birds"); ... app.use("/birds", birds);
應(yīng)用即可處理發(fā)自 /birds 和 /birds/about 的請(qǐng)求,并且調(diào)用為該路由指定的 timeLog 中間件。
webpack-dev-serverwebpack-dev-server 為你提供了一個(gè)簡(jiǎn)單的 web 服務(wù)器,并且能夠?qū)崟r(shí)重新加載(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 下建立服務(wù),將 dist 目錄下的文件,作為可訪問(wèn)文件。類似于通過(guò) Express 內(nèi)置的 express.static 托管靜態(tài)文件,例如圖片、CSS、JavaScript 文件等,通過(guò)文件路徑就可以訪問(wèn)文件了。
devServer.before
提供在服務(wù)器內(nèi)部的所有其他中間件之前執(zhí)行定制中間件的功能。 這可以用來(lái)定義自定義處理程序,例如:
app.get("/some/path", function(req, res) { res.json({ custom: "response" }); }); }webpack-dev-middleware
webpack-dev-middleware 是一個(gè)容器(wrapper),它可以把 webpack 處理后的文件傳遞給一個(gè)服務(wù)器(server)。 webpack-dev-server 在內(nèi)部使用了它。
模擬數(shù)據(jù)基本原理讀取本地所有json文件的相對(duì)路徑
require這些相對(duì)路徑讀取文件內(nèi)容
把讀取到的內(nèi)容全部放到一個(gè)json文件中
對(duì)每個(gè)本文件中的url路徑設(shè)置express的路由監(jiān)聽(tīng)
監(jiān)聽(tīng)到的每個(gè)路徑采用res.send返回結(jié)果,結(jié)果是通過(guò)url對(duì)應(yīng)的key去往步驟3的json文件中去取對(duì)應(yīng)的對(duì)象
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請(qǐng)求 console.log("-----",getApi); var postApi= appData["post"];//所有的post請(qǐng)求 //查找所有的json文件 var entryJS = {}; /*https://www.mgenware.com/blog/?p=2716---使用特殊的**來(lái)遞歸返回所有子目錄內(nèi)的文件,因?yàn)槟J(rèn)node-glob只會(huì)返回一級(jí)子目錄下得內(nèi)容。*/ let jsonFilesList = glob.sync("./data/**/*.json"); console.log("jsonFilesList-----",jsonFilesList); /*獲取所有json文件的相對(duì)路徑(相對(duì)于本文件)))*/ 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文件到一個(gè)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;
就可以模擬本地?cái)?shù)據(jù)了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/95607.html
摘要:解決思路服務(wù)器端渲染服務(wù)器端和前端公用同一個(gè)應(yīng)用,然后通過(guò)構(gòu)建工具及配置,確定哪些組件需要再服務(wù)器端渲染,那些組件需要再客戶端渲染。服務(wù)器端渲染,由框架與構(gòu)建工具配合,并依據(jù)一定的項(xiàng)目結(jié)構(gòu)和編碼方式,共同運(yùn)行。 分離 為什么需要 前后端分離、web服務(wù)器與static服務(wù)器分離: 前端與后端耦合 (需求) 自動(dòng)化、工程化的構(gòu)建前端的代碼 (基礎(chǔ)條件) 模塊化、組件化,項(xiàng)目共享代碼 (...
摘要:實(shí)現(xiàn)前后端分離的心得對(duì)目前的來(lái)說(shuō),前后端分離已經(jīng)變得越來(lái)越流行了,越來(lái)越多的企業(yè)網(wǎng)站都開(kāi)始往這個(gè)方向靠攏。前后端工作分配不均。 實(shí)現(xiàn)前后端分離的心得 對(duì)目前的web來(lái)說(shuō),前后端分離已經(jīng)變得越來(lái)越流行了,越來(lái)越多的企業(yè)/網(wǎng)站都開(kāi)始往這個(gè)方向靠攏。那么,為什么要選擇前后端分離呢?前后端分離對(duì)實(shí)際開(kāi)發(fā)有什么好處呢? 為什么選擇前后端分離 在以前傳統(tǒng)的網(wǎng)站開(kāi)發(fā)中,前端一般扮演的只是切圖的工作...
摘要:如何去解決這些問(wèn)題前后端分離大部分的互聯(lián)網(wǎng)公司都分成了前端團(tuán)隊(duì)和后端團(tuán)隊(duì)。方案一采用架構(gòu)業(yè)界很多公司會(huì)采用,單頁(yè)應(yīng)用的架構(gòu),這種架構(gòu)是天然的前后端分離的。方案二淘寶的大前端方案中途島上圖是淘寶基于的前后端分離分層,以及的職責(zé)范圍。 我們遇到了什么問(wèn)題? 1.前端無(wú)法調(diào)試后端未完成的 API:如果后端同學(xué)還沒(méi)有完成 API 開(kāi)發(fā),那么前端同學(xué)就不能對(duì)這個(gè) API 進(jìn)行開(kāi)發(fā)。之前我們都是在...
摘要:優(yōu)雅的使用框架,爬取唐詩(shī)別苑網(wǎng)的詩(shī)人詩(shī)歌數(shù)據(jù)同時(shí)在幾種動(dòng)態(tài)加載技術(shù)中對(duì)比作選擇雖然差不多兩年沒(méi)有維護(hù),但其本身是一個(gè)優(yōu)秀的爬蟲(chóng)框架的實(shí)現(xiàn),源碼中有很多值得參考的地方,特別是對(duì)爬蟲(chóng)多線程的控制。 優(yōu)雅的使用WebMagic框架,爬取唐詩(shī)別苑網(wǎng)的詩(shī)人詩(shī)歌數(shù)據(jù) 同時(shí)在幾種動(dòng)態(tài)加載技術(shù)(HtmlUnit、PhantomJS、Selenium、JavaScriptEngine)中對(duì)比作選擇 We...
摘要:爬蟲(chóng)介紹二爬蟲(chóng)的分類通用網(wǎng)絡(luò)爬蟲(chóng)全網(wǎng)爬蟲(chóng)爬行對(duì)象從一些種子擴(kuò)充到整個(gè),主要為門戶站點(diǎn)搜索引擎和大型服務(wù)提供商采集數(shù)據(jù)。 分分鐘教你用node.js寫個(gè)爬蟲(chóng) 寫在前面 十分感謝大家的點(diǎn)贊和關(guān)注。其實(shí),這是我第一次在segmentfault上寫文章。因?yàn)槲乙彩乔岸螘r(shí)間偶然之間才開(kāi)始了解和學(xué)習(xí)爬蟲(chóng),而且學(xué)習(xí)node的時(shí)間也不是很長(zhǎng)。雖然用node做過(guò)一些后端的項(xiàng)目,但其實(shí)在node和爬蟲(chóng)方面...
閱讀 3192·2021-11-24 09:39
閱讀 1059·2021-09-07 10:20
閱讀 2520·2021-08-23 09:45
閱讀 2397·2021-08-05 10:00
閱讀 658·2019-08-29 16:36
閱讀 905·2019-08-29 11:12
閱讀 2889·2019-08-26 11:34
閱讀 1892·2019-08-26 10:56