哈。github的地址已經(jīng)更換,求start
https://github.com/mySoul8012
繼續(xù)~
Express框架
Express事實(shí)上Node內(nèi)置的http模塊上構(gòu)建的一層抽象。理論上所有Express實(shí)現(xiàn)的功能都能用Node實(shí)現(xiàn)
核心特征;
設(shè)置中間件響應(yīng)http請(qǐng)求
定義路由表,執(zhí)行不同的http請(qǐng)求
先模板傳遞參數(shù),來(lái)動(dòng)態(tài)的渲染html文件
一些網(wǎng)址npm的Express https://www.npmjs.com/package...
項(xiàng)目地址 https://github.com/expressjs/...
網(wǎng)址和文檔 http://expressjs.com/
翻譯的中文文檔 http://expressjs.com/zh-cn/
使用npm安裝,并將其保存進(jìn)入依賴列表中
由于一堵高不可攀的墻大人的問(wèn)題,所以呢,被迫使用cnpm,使用來(lái)自淘寶的鏡像,由淘寶完成鏡像的同步
節(jié)省一點(diǎn)點(diǎn)寶貴的時(shí)間(^o^)/
全新安裝的需要安裝淘寶的鏡像 https://npm.taobao.org/ 使用cnpm代替npm完成安裝-save 的意思為自動(dòng)更新依賴文件,依賴文件為package.json
PS C:UsersmingmDesktop estExpress> cnpm install express --save √ Installed 1 packages √ Linked 46 latest versions √ Run 0 scripts Recently updated (since 2018-07-21): 1 packages (detail see file C:UsersmingmDesktop estExpress ode_modules.recently_updates.txt) √ All packages installed (51 packages installed from npm registry, used 3s(network 3s), speed 291.62kB/s, json 47(354.74kB), tarball 535kB) PS C:UsersmingmDesktop estExpress>
查看依賴pacage.json文件
{ "dependencies": { "express": "^4.16.3" } }
可以看到依賴的是express的4.16.3版本
查看一下目錄
PS C:UsersmingmDesktop estExpress> ls 目錄: C:UsersmingmDesktop estExpress Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2018/7/28 18:35 node_modules -a---- 2018/7/28 18:35 53 package.json PS C:UsersmingmDesktop estExpress>
可以查看到有一個(gè)node_modules目錄,該目錄保存的是npm包
一些還需要安裝的模塊body-parser 一個(gè)node的中間件 用于處理JSON,等和URL的編碼的處理
https://www.npmjs.com/package...
文檔以及項(xiàng)目地址 https://github.com/expressjs/...
cookie-parser 一個(gè)負(fù)責(zé)解析Cookie的工具可以將傳過(guò)來(lái)的Cookie將其轉(zhuǎn)換為對(duì)象
https://www.npmjs.com/package...
multer node.js的中間件 處理表單數(shù)據(jù)
項(xiàng)目地址 https://github.com/expressjs/...
npm https://www.npmjs.com/package...
自訴文件 https://github.com/expressjs/...
原版的自述文件 https://github.com/expressjs/...
好啦。一共是一塊安裝了3個(gè)模塊
繼續(xù)使用淘寶源
PS C:UsersmingmDesktop estExpress> cnpm install body-parser --save √ Installed 1 packages √ Linked 0 latest versions √ Run 0 scripts √ All packages installed (used 248ms(network 242ms), speed 23.48kB/s, json 1(5.68kB), tarball 0B) PS C:UsersmingmDesktop estExpress> cnpm install cookie-parser --save √ Installed 1 packages √ Linked 0 latest versions √ Run 0 scripts √ All packages installed (used 264ms(network 258ms), speed 4.99kB/s, json 1(1.29kB), tarball 0B) PS C:UsersmingmDesktop estExpress> cnpm install multer --save √ Installed 1 packages √ Linked 21 latest versions √ Run 0 scripts √ All packages installed (22 packages installed from npm registry, used 1s(network 1s), speed 307.56kB/s, json 22(92.57kB), tarball 343.86kB) PS C:UsersmingmDesktop estExpress>
完成三個(gè)模塊的安裝
查看一下依賴文件
{ "dependencies": { "body-parser": "^1.18.3", "cookie-parser": "^1.4.3", "express": "^4.16.3", "multer": "^1.3.1" } }
依賴四個(gè)模塊
創(chuàng)建一個(gè)框架實(shí)例輸出hello world!
// app.js文件 var express = require("express"); var app = express(); app.get("/", (req, res) => { res.send("hello world!"); }); var server = app.listen(1938, () => { var host = server.address().address; var port = server.address().port; console.log("%s:%s", host, port); })
PS C:UsersmingmDesktopindexExpress> node app.js :::1938
此程序會(huì)監(jiān)聽(tīng)1938上的連接,當(dāng)有連接傳入的時(shí)候,應(yīng)用程序會(huì)以hello world!進(jìn)行響應(yīng),然后將其返回。
路由路由決定了由誰(shuí)響應(yīng)http請(qǐng)求,通過(guò)提取GET和POST請(qǐng)求的參數(shù),下面繼續(xù)擴(kuò)展程序
PS C:UsersmingmDesktopindexExpress> node app.js { address: "::", family: "IPv6", port: 1937 }
var express = require("express"); var app = express(); // 輸出hello world app.get("/", (req, res) => { console.log("輸出對(duì)于主頁(yè)的GET請(qǐng)求"); res.send("Hello GET!"); }); // post請(qǐng)求 app.post("/", (req, res) => { console.log("主頁(yè)post請(qǐng)求"); res.send("Hello POST"); }); // 對(duì)于/del_user的頁(yè)面響應(yīng) app.get("/del_user", (req, res) => { console.log("這是對(duì)于頁(yè)面 /del_user頁(yè)面的響應(yīng)"); res.send("Hello del_user"); res.send("你好哈! 這里已經(jīng)將頁(yè)面進(jìn)行刪除"); }); // /list_user 頁(yè)面的GET請(qǐng)求 app.get("/list_user", (req, res) => { console.log("這里是對(duì) /list_user頁(yè)面的請(qǐng)求"); res.send("Hello list_user"); }); // /對(duì)頁(yè)面abcd abcdxcd ab123cd 的請(qǐng)求進(jìn)去正則 app.get("ab*cd", (req, res) => { console.log("進(jìn)行了正則"); res.send("hello 正則!"); }); // 啟動(dòng)http服務(wù)器 var server = app.listen(1937, () => { console.log(server.address()); });
訪問(wèn) http://127.0.0.1:1937/del_user
返回 Hello del_user
好啦!(^o^)/
Express使用了中間件 express.static中間件設(shè)置靜態(tài)文件
事實(shí)上是一個(gè)http服務(wù)器外加一個(gè)fs模塊完成封裝的
目錄結(jié)構(gòu)如下
- Express // 站點(diǎn)文件 - image // 圖片文件夾 1.gif // 將要訪問(wèn)的靜態(tài)資源 + node_modules // npm包所在文件夾 app.js // 入口文件 package.json // 配置文件
代碼如下
PS C:UsersmingmDesktopindexExpress> node app.js { address: "::", family: "IPv6", port: 1937 }
var express = require("express"); var app = express(); app.use(express.static("./image")); // 使用中間件 express.static 設(shè)置的靜態(tài)資源文件夾為image app.get("/", (req, res) => { res.send("hello world!"); }); var server = app.listen(1937, () => { console.log(server.address()); });
訪問(wèn) http://127.0.0.1:1937/1.gif
出現(xiàn)靜態(tài)資源,(^o^)/
res.sendFile() http://expressjs.com/en/4x/ap...__dirname 獲取當(dāng)前執(zhí)行文件所在目錄的完整目錄名
res.sendFlie(path [,options] [,fn]) path必須為絕對(duì)路徑,Content-Type 會(huì)根據(jù)擴(kuò)展名設(shè)置相應(yīng)的HTTP標(biāo)頭字段,需要注意的是path必須為絕對(duì)路徑__dirname 獲取當(dāng)前執(zhí)行文件所在目錄的完整目錄名
__filename 獲取當(dāng)前執(zhí)行文件帶有完整絕對(duì)路徑的文件名
process.cwd() 獲取當(dāng)前執(zhí)行node命令時(shí)候的文件夾的目錄名
./ 文件所在目錄req.query 此屬性是一個(gè)對(duì)象,包含路由中每個(gè)查詢字符串參數(shù)的屬性。
304請(qǐng)求 一個(gè)條件請(qǐng)求,如果有緩存的數(shù)據(jù)則進(jìn)行請(qǐng)求,否則將不會(huì)進(jìn)行請(qǐng)求
Hello from
var express = require("express"); var app = express(); app.use(express.static("public")); // 加載中間件 app.get("/index.html", (req, res) => { // 調(diào)用中間件指定的靜態(tài)資源目錄 public, 然后調(diào)用回調(diào)函數(shù) res.sendFile( __dirname + "/" + "index.html"); // 輸出html文件的絕對(duì)路徑,采取的是拼接字符串的方式,設(shè)置http標(biāo)頭 }); app.get("/process_get", (req, res) => { // 輸出json格式 var response = { "first_name": req.query.first_name, // 將http報(bào)文中 查詢到的first_name的值作為屬性值 "last_name": req.query.last_name // 同上 }; console.log(response); // 輸出獲取到的json的值 res.end(JSON.stringify(response)); // 將獲取到的值轉(zhuǎn)為JSON格式的值,然后進(jìn)行返回 }); var server = app.listen(1937, () => { console.log(server.address()); });
用瀏覽器查看一下json數(shù)據(jù)
請(qǐng)求為get 發(fā)送的url為 http://127.0.0.1:1937/process_get?first_name=ming&last_name=ming
查詢的字符串為
first_name=ming
last_name=ming
總共,請(qǐng)求頭為
Host: 127.0.0.1:1937 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://127.0.0.1:1937/ Cookie: hibext_instdsigdipv2=1 Connection: keep-alive Upgrade-Insecure-Requests: 1
主機(jī)地址為127.0.0.1:1937
user-Agent為本地的系統(tǒng)的一些信息
剩下的有點(diǎn)看不懂。。╮(╯▽╰)╭
由于設(shè)置的是直接返回JSON數(shù)據(jù),所以查看一下響應(yīng)頭
{"first_name":"ming","last_name":"ming"}
此為響應(yīng)載荷
報(bào)文為
HTTP/1.1 200 OK X-Powered-By: Express Date: Sat, 28 Jul 2018 16:39:08 GMT Connection: keep-alive Content-Length: 40
采用的是http1.1協(xié)議,返回的報(bào)文為200
同理
DevTol也是如此不在進(jìn)行闡述
需要使用一個(gè)中間件 body-parser,其簡(jiǎn)單的文檔 https://www.npmjs.com/package...需要使用一個(gè)bodyParser.urlencoded 該對(duì)象返回解析urlencoded主體。在返回的body中,將會(huì)在req對(duì)象上添加一個(gè)新的對(duì)象,該對(duì)象為body。其中的值為字符串和數(shù)組,此對(duì)象會(huì)包含鍵值對(duì)。其中的值可以為字符串和數(shù)組(此時(shí)設(shè)置的extended的值為false),其中的值允許為任何類型的需要設(shè)置extended的值為last
var express = require("express"); var app = express(); var bodyParser = require("body-parser"); // 加載Express中間件 // 使用中間件提供的bodyParser.urlencoded對(duì)來(lái)自于post的url進(jìn)行解析,只允許字符串和數(shù)字類型的結(jié)果 var urlencodeParser = bodyParser.urlencoded({ extended: false }); app.use(express.static("public")); // 設(shè)置靜態(tài)資源目錄為public // 進(jìn)行路由匹配 app.get("/index.html", (req, res) => { res.sendFile(__dirname + "/" + "index.html"); // 路徑的拼接,拼接的是當(dāng)前文件的所在目錄的絕對(duì)地址,由于要請(qǐng)求靜態(tài)資源,自動(dòng)跳到public文件夾下進(jìn)行返回 }); // post請(qǐng)求的匹配 app.post("/process_post", urlencodeParser, (req, res) => { // 先進(jìn)行回調(diào)第一個(gè)函數(shù),將post請(qǐng)求,使用中間件進(jìn)行處理,處理完后的值進(jìn)行返回到req和res即下一個(gè)回調(diào)函數(shù),數(shù)據(jù)經(jīng)過(guò)兩次回調(diào) // 輸出JSON格式 var response = { "first_name": req.body.first_name, // 進(jìn)行鍵值對(duì)的保存 "last_name": req.body.last_name }; console.log(response); // 將接收到的數(shù)據(jù)進(jìn)行輸出 res.end(JSON.stringify(response)); // 將鍵值對(duì)保存的對(duì)象轉(zhuǎn)化為JSON格式返回給客戶端 }); var server = app.listen(1937, () => { // 開(kāi)啟http服務(wù)器 console.log(server.address()); });
Hello from
ok~
好啦。訪問(wèn) http://127.0.0.1:1937
順便打開(kāi)瀏覽器開(kāi)發(fā)者工具進(jìn)行查看返回的JSON數(shù)據(jù)
{"first_name":"ming","last_name":"ming"}
?(^?^*)完美~
文件上傳使用post方法完成文件的上傳。
from 表單的enctype屬性當(dāng)method屬性值為post的時(shí)候,enctype提交的是from給服務(wù)器內(nèi)容的mime類型,即媒體類型,解釋一下form表單的enctype的三個(gè)值
http的post方法,給服務(wù)器時(shí),請(qǐng)求主題類型由 Content-Type 指定,通常一個(gè)POST請(qǐng)求是通過(guò)HTML表單發(fā)送的,并返回給服務(wù)器返回修改的結(jié)果,form表單的enctype屬性是設(shè)置上傳的編碼的
application/x-www-form-urlencoded 數(shù)據(jù)被編碼成為&進(jìn)行分割的鍵值對(duì)同時(shí)以=作為分割的鍵值對(duì)。非字母和數(shù)字的字符會(huì)被進(jìn)行百分比編碼 解釋 https://developer.mozilla.org...
multipart/form-data 將會(huì)以二進(jìn)制的方式進(jìn)行上傳,上傳文件的時(shí)候必須按照這個(gè)方法進(jìn)行提交
text/plain 空格轉(zhuǎn)化為+號(hào),不對(duì)其做任何的處理進(jìn)行提交
https://developer.mozilla.org...
multer(opts) opts具有一個(gè)dest屬性,將會(huì)告訴Multer中間件上傳到服務(wù)器的位置。
multer(opts)接受鏈?zhǔn)秸{(diào)用.array(fieldname[, maxCount]) 支持一個(gè)是否為文件數(shù)組
/* var express = require("express"); var app = express(); // 創(chuàng)建框架的類 var fs = require("fs"); var bodyParser = require("body-parser"); // 加載中間件 var multer = require("multer"); var storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, "./image") // 文件上傳的目錄 }, filename: (req, file, cb) => { var fileFormat = (file.originalname).split("."); // 先將文件名采用split按照.進(jìn)行分裂 cb(null, file.fieldname + "-" + Date.now() + "." + fileFormat[fileFormat.length - 1]); // 對(duì)文件重命名,加上擴(kuò)展名 } }); // 確定一下上傳的配置選項(xiàng) app.use(express.static("public")); // 添加靜態(tài)文件,用于處理靜態(tài)文件,框架自帶的 app.use(bodyParser.urlencoded({ extended: false })); // 用于處理JSON等數(shù)據(jù) app.use(multer({storage: storage}).array("image")); app.get("/index.html", (req, res) => { res.sendFile( __dirname + "/" + "index.html" ); // 對(duì)于首頁(yè)的請(qǐng)求 }); // 該過(guò)程中間經(jīng)歷了對(duì)靜態(tài)文件的(static中間件,urlencoded對(duì)url的解析,只允許字符串和數(shù)字的結(jié)果,使用了上傳的multer的中間件,最后到回調(diào)函數(shù)) app.post("/file_upload", (req, res) => { // 允許上傳多個(gè)文件,其中文件數(shù)組保存在req.files console.log(req.files[0]); // 上傳文件的信息 var des_file = __dirname + "/" + req.files[0].originalname; fs.readFile( req.files[0].path, function (err, data) { fs.writeFile(des_file, data, function (err) { if( err ){ console.log( err ); }else{ response = { message:"File uploaded successfully", filename:req.files[0].originalname }; } console.log( response ); res.end( JSON.stringify( response ) ); }); }); }); var server = app.listen(1937, () => { console.log(server.address()); }); */ var express = require("express"); var app = express(); var fs = require("fs"); var bodyParser = require("body-parser"); var multer = require("multer"); app.use(express.static("public")); app.use(bodyParser.urlencoded({ extended: false })); app.use(multer({ dest: "/tmp/"}).array("image")); // 設(shè)置臨時(shí)上傳的地址 app.get("/index.htm", function (req, res) { res.sendFile( __dirname + "/" + "index.htm" ); }) app.post("/file_upload", function (req, res) { console.log(req.files[0]); // 上傳的文件信息 var fileFormat = (req.files[0].originalname).split("."); var fileName = req.files[0].fieldname + "-" + Date.now() + "." + fileFormat[fileFormat.length - 1]; var des_file = __dirname + "/image/" + fileName; // 將要上傳的地址 console.log(des_file); fs.open( "./image/" + fileName, "a", function(err, fd) { if (err) { return console.error(err); } fs.readFile( req.files[0].path, (err, data) => { fs.writeFile(des_file, data, (err) => { console.log(data); if( err ){ console.log( err ); }else{ response = { message:"File uploaded successfully", filename:req.files[0].originalname }; } console.log( response ); res.end( JSON.stringify( response ) ); }); }); }); }); var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("應(yīng)用實(shí)例,訪問(wèn)地址為 http://%s:%s", host, port) })
思路,是先將文件以追加的方式打開(kāi),然后將通過(guò)中間件上傳的文件寫入追加打開(kāi)的文件
Cookie管理文件上傳表單 文件上傳
使用中間件發(fā)送Cokie信息。
引入cookie-parser
再引入 util模塊,將對(duì)象轉(zhuǎn)換為字符串
這個(gè)很簡(jiǎn)單。過(guò)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/96404.html
摘要:一個(gè)標(biāo)準(zhǔn)性的事件就是年的橫空出世。引擎快速處理能力和異步編程風(fēng)格,讓開(kāi)發(fā)者從多線程中解脫了出來(lái)。其次,通過(guò)異步編程范式將其高并發(fā)的能力發(fā)揮的淋漓盡致。它也僅僅是一個(gè)處理請(qǐng)求并作出響應(yīng)的函數(shù),并無(wú)任何特殊之處。 showImg(https://segmentfault.com/img/remote/1460000010819116); 在正式學(xué)習(xí) Express 內(nèi)容之前,我們有必要從大...
摘要:項(xiàng)目地址腳手架使用過(guò),的同學(xué)都清楚,官方推薦的安裝方式是通過(guò)專用的來(lái)快速搭建一個(gè)由編譯打包的項(xiàng)目框架。用在層的模塊化,在中間層實(shí)現(xiàn)了模塊化。這樣,從中間層到前端都實(shí)現(xiàn)了熱加載。 版權(quán)聲明:更多文章請(qǐng)?jiān)L問(wèn)我的個(gè)人站Keyon Y,轉(zhuǎn)載請(qǐng)注明出處。 項(xiàng)目地址:https://github.com/KeyonY/NodeMiddle 腳手架? 使用過(guò)angular2,vue2的同學(xué)都清楚,官...
摘要:中文官網(wǎng)快速入門安裝項(xiàng)目中引入得到服務(wù)器實(shí)例綁定服務(wù)器接受請(qǐng)求事件,并且添加處理回調(diào)函數(shù)綁定服務(wù)端口,啟動(dòng)服務(wù)器運(yùn)行項(xiàng)目利用框架可以減少我們的代碼量,比起之前使用核心模塊構(gòu)建服務(wù)器代碼排版更直觀。Express框架是一款簡(jiǎn)潔而靈活的node.js web應(yīng)用框架。前面我們自己手動(dòng)創(chuàng)建服務(wù)器在Express中就是一個(gè)API的事情,這就使得我們更加注重業(yè)務(wù)的功能和開(kāi)發(fā)效率上,不必糾結(jié)過(guò)多底層的事...
摘要:本文轉(zhuǎn)載自眾成翻譯譯者網(wǎng)絡(luò)埋伏紀(jì)事鏈接原文本章我會(huì)指導(dǎo)你啟動(dòng)一個(gè)簡(jiǎn)單的服務(wù)器,并開(kāi)始為請(qǐng)求服務(wù)。現(xiàn)在,我們開(kāi)始創(chuàng)建第一個(gè)服務(wù)器我們將模塊,并將服務(wù)器綁定到端口來(lái)監(jiān)聽(tīng)。必須用如下方式啟動(dòng)服務(wù)器總結(jié)本章學(xué)習(xí)了如何從頭開(kāi)始創(chuàng)建第一個(gè)服務(wù)器。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1750原文:https://blog.risings...
摘要:前言要做一個(gè)全沾的工程師,對(duì)于后端和數(shù)據(jù)庫(kù)來(lái)說(shuō),即使不認(rèn)識(shí)也要見(jiàn)個(gè)面的。基本了解的概念就好,主要是安裝上數(shù)據(jù)庫(kù),并進(jìn)行簡(jiǎn)單的增刪操作。 前言:要做一個(gè)全沾的工程師,對(duì)于后端和數(shù)據(jù)庫(kù)來(lái)說(shuō),即使不認(rèn)識(shí)也要見(jiàn)個(gè)面的。本文給的例子很簡(jiǎn)單,也貼出來(lái)源碼,只要一步步下來(lái),就可以跑起來(lái)啦~~~ 思考一個(gè)需求:做一個(gè)登錄頁(yè)面,自己搭建服務(wù)和數(shù)據(jù)庫(kù),將用戶輸入的登錄信息保存到數(shù)據(jù)庫(kù)如何完成呢:首先選擇...
摘要:使用承諾和異步功能來(lái)擺脫回調(diào)地獄的應(yīng)用程序,并簡(jiǎn)化錯(cuò)誤處理。它暴露了自己的和對(duì)象,而不是的和對(duì)象。因此,可被視為的模塊的抽象,其中是的應(yīng)用程序框架。這使得中間件對(duì)于整個(gè)堆棧而言不僅僅是最終應(yīng)用程序代碼,而且更易于書寫,并更不容易出錯(cuò)。 Koa 與 Express 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進(jìn)或 Star 關(guān)注更新...
閱讀 1236·2021-11-23 09:51
閱讀 683·2021-11-19 09:40
閱讀 1347·2021-10-11 10:58
閱讀 2356·2021-09-30 09:47
閱讀 3729·2021-09-22 15:55
閱讀 2164·2021-09-03 10:49
閱讀 1259·2021-09-03 10:33
閱讀 701·2019-08-29 17:12