node.js express框架簡介與實現(xiàn)
前言
之前學習過node.js接觸過express框架,最近為了編寫一個mock server正好用到了express。下面正好就跟大家介紹一下關于express。
今天的內容主要圍繞這么幾個方面?
- express框架初步介紹
- express框架中的app.use和app.get/app.post
- mock server 介紹
- mock server的實現(xiàn)思路
一、express框架初步介紹
關于express框架的介紹,這里我引用菜鳥教程的簡介:
Express是一個簡潔而靈活的node.js web框架,提供了一系列強大特性幫助你創(chuàng)建各種web應用,和豐富的HTTP工具。使用Express可以快速地搭建一個完整功能的網站。
1.express框架的特性
- (1)可以設置中間件來響應HTTP請求;
- (2)定義了路由表用于執(zhí)行不同大的HTTP請求動作;
- (3)可以通過向模板傳遞參數來動態(tài)渲染HTML頁面;
2.安裝express
npm install express --save或cnpm install express --save
以下幾個重要需要與express框架一起安裝:
- body-parser -node.js中間件,用于處理JSON,Raw,Text和URL編碼的數據;
- cookie-parser -這就是一個解析Cookie的工具。通過req.cookies可以取到傳過來的cookie,并將它們轉為對象;
- multer - node.js中間件,用于處理enctype=“multipart/form-data”(設置表單mime編碼)的表單數據;
安裝命令如下所示:
npm install body-parser --save npm install cookie-parser --save npm install multer --save
3.express的入門程序
node_learning.js代碼如下:
var express = require('express'); var app = express(); app.get('/', function (req, res) { res.send('Hello World'); }) var server = app.listen(2019, function () { var host = server.address().address var port = server.address().port console.log("應用實例,訪問地址為 http://127.0.0.1:2019", host, port) })
二、express框架中的app.use和app.get/app.post
app.use和app.get/app.post其實區(qū)別如(引用一位朋友說的):
感興趣的可以參考這個鏈接:作者做了試驗測試過的
(1)app.use(path,callback)中的callback既可以是router對象又可以是函數
(2)app.get(path,callback)中的callback只能是函數
app.use和app.get/app.post實現(xiàn)幾乎大同小異,代碼示例如下:
var express = require('express'); var app = express(); function testUser(req, res, next){ // req 參數可以接受一些請求的參數(req.query/req.body) 和 請求頭信息 // res 用于響應信息 // 調用next()方法則進入下一個中間件 res.send("測試用戶"); } function testLogin(req,res,next){ res.send("測試登錄"); } var server = app.listen(2019, function () { var host = server.address().address var port = server.address().port console.log("應用實例,訪問地址為 http://127.0.0.1:2019") }) //路徑匹配 app.use('/user',testUser); app.get('/login',testLogin);
關于node.js的express框架就介紹這么多,最近本人因實現(xiàn)某個插件的功能而需要用到的,這與下面說的mock server有比較大的關系。
三、mock server 介紹
mock server 翻譯過來的意思是模擬服務。
說到這我相信大家就很容易理解了。至于為什么要模擬服務?
比方說現(xiàn)今的業(yè)務系統(tǒng)很少有孤立存在的,它們或多或少使用其他公司提供的服務,這給我們聯(lián)調和測試造成了比較大的麻煩,對于這種情況,常見的解決方案就是搭建一個mock server,模擬那些服務器,提供數據進行聯(lián)調和測試
四、mock server的實現(xiàn)思路
現(xiàn)在google或者being搜索mock server 實現(xiàn)思路肯定有很多,這里我就不再贅述。
這里我以我自己最近的vscode插件開發(fā)來說。
我最近的工作是針對Settings-Sync作二次開發(fā)
關于settings-sync插件,感興趣的可以參考我的博客園Settings-Sync源碼閱讀
如何實現(xiàn)一個mock server 替換github api地址并確保效果一致?
針對目前這個需求,我的實現(xiàn)思路如下:
- 第一,針對如何實現(xiàn)一個mock server ,可以復用已有,如mock-github-api(其本身是使用node.js的express框架);
- 第二,如何編寫,可以按照express框架編寫網絡請求的方法,如app.get或app.use等;
- 第三,為了保持與githu api一致,我需要引入github rest api,如@octokit/rest;
參考api地址
示例一: octokit.repos.listForOrg({ org: 'octokit', type: 'public' }).then(({ data, status, headers }) => { // handle data //console.log("status:"+JSON.stringify(headers)); //console.log(status); console.log(data); }) 返回的octokit相關的api信息(信息太多了,就先簡略)
示例二: const clientWithAuth = new Octokit({ auth: 'token secret123' }) console.log(clientWithAuth)//查看詳細信息 console.log(JSON.stringify(clientWithAuth))//輸出簡要信息如下 所示: 返回的信息: {"log":{},"activity":{},"apps":{},"checks":{},"codesOfConduct":{},"emojis":{}, "gists":{},"git":{},"gitignore":{},"interactions":{},"issues":{},"licenses":{}, "markdown":{},"meta":{},"migrations":{},"oauthAuthorizations":{},"orgs":{}, "projects":{},"pulls":{},"rateLimit":{},"reactions":{},"repos":{},"search":{}, "teams":{},"users":{},"gitdata":{},"authorization":{},"pullRequests":{} }
第四,根據router.json(node_modules\@octokit\rest\plugins\rest-api-endpoints\routes.json)也就是octokit里面定義github rest api的地方(該文件定義了所需的所有的請求信息),我可以仿照其編寫對應的網絡請求(美其名依樣畫葫蘆);
如果要用一句簡單直接的話來概述,模仿github rest api編寫一個mock server來替換github,只要接口定義保持一致就可以。
但是目前存在一個問題,我在此停滯不前。正在想辦法解決這個問題。
這個問題是,我參考其對應的rest api文檔寫代碼,但是其返回的信息卻并沒有我想要的,返回是一大堆沒有用處的function之類的,而不是具體的信息。
但是以5why原則來看待這個問題:
為什么github api會返回一大堆function?
這些function有什么用?github api不會無緣無故返回沒有用的東西
還有就是為什么console.log(clientWithAuth)返回詳細信息,console.log(JSON.stringify(clientWithAuth))返回的卻是簡要信息呢?難道是因為非JSON數據嗎?兩者返回的都是JSON數據
我查找JSON.stringify()認為應該是這個原因:
JSON.stringify() 方法是將一個JavaScript值(對象或者數組)轉換為一個 JSON字符串,如果指定了replacer是一個函數,則可以替換值,或者如果指定了replacer是一個數組,可選的僅包括指定的屬性(參考地址)
另外前面雖說不講mock server的實現(xiàn)思路,但是還是要推薦一下一個開源實現(xiàn)框架 moco。
github倉庫地址為:https://github.com/dreamhead/moco
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Node.js的Express框架使用上手指南
- 從零開始學習Node.js系列教程之基于connect和express框架的多頁面實現(xiàn)數學運算示例
- node.js使用express框架進行文件上傳詳解
- Node.js + express實現(xiàn)上傳大文件的方法分析【圖片、文本文件】
- node.js(express)中使用Jcrop進行圖片剪切上傳功能
- 淺析Node.js實現(xiàn)HTTP文件下載
- Node.js 使用request模塊下載文件的實例
- Node.JS段點續(xù)傳:Nginx配置文件分段下載功能的實現(xiàn)方法
- 基于nodejs+express4.X實現(xiàn)文件下載的實例代碼
- nodejs+express實現(xiàn)文件上傳下載管理網站
- 使用nodejs+express實現(xiàn)簡單的文件上傳功能
- node.js express框架實現(xiàn)文件上傳與下載功能實例詳解
相關文章
nodejs創(chuàng)建簡易web服務器與文件讀寫的實例
下面小編就為大家?guī)硪黄猲ode js系列課程-創(chuàng)建簡易web服務器與文件讀寫的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09node?NPM庫qs?iconv-lite字符串編碼轉換及解析URL查詢學習
這篇文章主要為大家介紹了node?NPM庫之qs解析URL查詢字符串及iconv-lite字符串編碼轉換學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07