node復(fù)習(xí)筆記
第一天
- 前端向后臺(tái)服務(wù)器發(fā)送請(qǐng)求的類型
- get: 用來(lái)獲取數(shù)據(jù)
- post: 用來(lái)提交數(shù)據(jù)
- 前端發(fā)送請(qǐng)求的方式
- 地址欄中直接輸入地址恤溶;
- form表單請(qǐng)求:
- 可以跨域進(jìn)行提交數(shù)據(jù)盯荤,跨域指的是自己創(chuàng)建的服務(wù)器旨巷;
- 缺點(diǎn):只能提交數(shù)據(jù)犹菱,不能對(duì)服務(wù)器響應(yīng)的數(shù)據(jù)進(jìn)行處理绕辖;
- jQuery中的ajax請(qǐng)求:
- 能進(jìn)行跨域提交數(shù)據(jù)胖腾,只能跨域獲取百度服務(wù)器中的數(shù)據(jù)霍比;不能獲取自己創(chuàng)建的服務(wù)器中的數(shù)據(jù)幕袱;
- 自己服務(wù)器中必須設(shè)置跨域請(qǐng)求的設(shè)置;
- 自己封裝的myAjax.js請(qǐng)求:
- 本質(zhì)和jQuery中的ajax請(qǐng)求一樣悠瞬;
- jsonp發(fā)送請(qǐng)求:通過(guò)script標(biāo)簽中src發(fā)送get請(qǐng)求们豌,可以進(jìn)行跨域請(qǐng)求;
- 服務(wù)器獲取前端請(qǐng)求的數(shù)據(jù)
- 獲取get請(qǐng)求的數(shù)據(jù):get請(qǐng)求的數(shù)據(jù)在地址欄中
- 接收get請(qǐng)求的方式有三種:
- 原生node方法:通過(guò)
req.url
來(lái)獲取地址字符串浅妆,通過(guò)split切割多次切割望迎,先通過(guò)"?"切割,再通過(guò)"&"切割凌外,獲取數(shù)組辩尊,遍歷,切割賦值對(duì)象康辑; - node自帶的系統(tǒng)模塊querystring和url模塊:1)模塊
querystring
摄欲;代碼:querystring.parse("key=val&key=val")
獲得一個(gè)參數(shù)對(duì)象轿亮;2)模塊url
;代碼url.parse(req.url,true).query
獲取到一個(gè)參數(shù)對(duì)象胸墙;
- 獲取post提交的數(shù)據(jù):post請(qǐng)求的數(shù)據(jù)在請(qǐng)求頭中哀托,相當(dāng)于把大塊數(shù)據(jù)拆分成多個(gè)小塊數(shù)據(jù);
- 原生node方法:字符串拼接
- 創(chuàng)建空字符串劳秋;
- 通過(guò)on綁定兩個(gè)事件,data和end事件胖齐;
- 在data事件匿名函數(shù)中玻淑,通過(guò)字符串拼接,會(huì)執(zhí)行多次呀伙,直到將所有小塊數(shù)據(jù)拼接完整补履;
- 在end事件匿名函數(shù)中,可以獲取str為post提交的數(shù)據(jù)剿另;只執(zhí)行一次箫锤;
const http=require("http"); const server=http.createServer(function (req, res) { if(req.url==="/favicon.ico"){ return; } console.log("server is running"); res.setHeader("Access-Control-Allow-Origin","http://localhost:63342"); var str=""; req.on("data",function (val) { str+=val; }); req.on("end",function () { console.log(str); res.end(str); }) }); server.listen(8888);
- 第三方模塊formidable
- 下載模塊并引入模塊;
- 新建form對(duì)象:
var form=new formidable.IncomingForm()
; - 解析上傳的數(shù)據(jù):
form.parse(req,function(err,fields,files){})
雨女;其中fileds獲取的post提交的數(shù)據(jù)谚攒;對(duì)象類型;
- 原生node方法:字符串拼接
- get和post請(qǐng)求共存方式
- 將get請(qǐng)求獲取參數(shù)的代碼氛堕,放在post請(qǐng)求的綁定事件end中馏臭,因?yàn)閑nd只觸發(fā)一次;
- 獲取get請(qǐng)求的數(shù)據(jù):get請(qǐng)求的數(shù)據(jù)在地址欄中
- 服務(wù)器進(jìn)行的跨域設(shè)置
- 原生node:
- 設(shè)置響應(yīng)頭:
res.setHeader("Access-Control-Allow-Origin","域名")
;
- 設(shè)置響應(yīng)頭:
- express中的跨域請(qǐng)求
- 原生node:
- 地址路徑解析
-
req.url
獲得的地址為:帶斜杠和后面的所有參數(shù)讼稚,如:/01.html?name=xxx&age=18
;- 其中pathname為:
/01.html
括儒,包含斜杠; - 其中search為:
?name=xxx&age=18
锐想,包含問(wèn)號(hào)帮寻;不包括哈希值;
- 其中pathname為:
-
- 知識(shí)點(diǎn)
- 在for循環(huán)中赠摇,存在異步操作時(shí)固逗,需要等循環(huán)結(jié)束來(lái)輸出數(shù)據(jù),可以通過(guò)判斷i的值藕帜,來(lái)判斷循環(huán)是否結(jié)束抒蚜,條件判斷時(shí),可以設(shè)置
i<=ary.length
耘戚,在循環(huán)中判斷i===ary.length
時(shí)嗡髓,循環(huán)結(jié)束;因?yàn)闂l件判斷為同步收津,會(huì)先于異步操作進(jìn)行判斷饿这,所以不能設(shè)置ary.length-1
浊伙;
- 在for循環(huán)中赠摇,存在異步操作時(shí)固逗,需要等循環(huán)結(jié)束來(lái)輸出數(shù)據(jù),可以通過(guò)判斷i的值藕帜,來(lái)判斷循環(huán)是否結(jié)束抒蚜,條件判斷時(shí),可以設(shè)置
第二天
- node模塊分類
- 分為三大類:
- 1)node自帶的模塊:如http,fs,querystring,url,path等;
- 2)引入第三方模塊:nodejs天生自帶一個(gè)包管理器npm长捧;
- 3)自定義模塊:自己創(chuàng)建的JS文件
- 通過(guò)require引入自定義模塊嚣鄙,必須設(shè)置相對(duì)路徑,
./
也不能省略串结,后綴.js
可以省略哑子; - 引入自定義模塊后,獲取的變量取決于被引入模塊輸出的變量肌割;
- 被引入模塊通過(guò)
module.exports={xxx:fn}
輸出對(duì)象變量卧蜓;
- 通過(guò)require引入自定義模塊嚣鄙,必須設(shè)置相對(duì)路徑,
- 三大類的加載順序:當(dāng)通過(guò)require引入模塊后,先在系統(tǒng)自帶的模塊中查找把敞,查找不到弥奸,在第三方模塊中查找,即在node_modules文件夾中查找奋早,若再找不到盛霎,就通過(guò)相對(duì)路徑在自定義模塊中查找;
- 分為三大類:
- 項(xiàng)目開發(fā)步驟:
- 命令行進(jìn)入文件夾
-
git init
:文件夾初始化耽装; -
npm init
:項(xiàng)目初始化愤炸,按照順序設(shè)置,生成package.json文件掉奄;- 通過(guò)
npm init --y
快速創(chuàng)建文件摇幻;
- 通過(guò)
-
npm install xxx -g
:安裝到全局; -
npm i xxx --save-dev
: 安裝到當(dāng)前目錄下挥萌;會(huì)在devdependencies中出現(xiàn)绰姻,指的是開發(fā)過(guò)程中的依賴; -
npm i xxx --save
:安裝到當(dāng)前目錄下引瀑,會(huì)在dependencies中出現(xiàn)狂芋,指的是在上線過(guò)程中的依賴; -
npm uninstall xxx
:卸載模塊憨栽;
- 登錄注冊(cè)功能實(shí)例:
- 登錄注冊(cè)頁(yè)面加載:
- 通過(guò)地址欄發(fā)送get請(qǐng)求帜矾,設(shè)置pathname為html文件名;
- 服務(wù)器中通過(guò)系統(tǒng)模塊url屑柔,獲取pathname屡萤,然后通過(guò)
fs.readFile(path,function(err,data){})
來(lái)讀取文件,其中path為html的相對(duì)路徑掸宛,通過(guò)res.end(data)
來(lái)將讀取的數(shù)據(jù)渲染到前端頁(yè)面中死陆,進(jìn)而使頁(yè)面呈現(xiàn);
- 頁(yè)面加載后,通過(guò)script的src引入的jquery.js文件措译,會(huì)再次發(fā)送一次get請(qǐng)求别凤,請(qǐng)求的地址pathname為引入的相對(duì)路徑,也必須通過(guò)fs.readFile讀取渲染到頁(yè)面领虹,頁(yè)面的jquery.js功能才能使用规哪;
- 登錄注冊(cè)頁(yè)面加載:
第三天
- 第三方模塊mime:
- 通過(guò)
npm i mime
進(jìn)行安裝 - 用處:頁(yè)面在加載文件時(shí),如css,html,js等,需要設(shè)置
Content-Tyep
類型塌衰;所以可以通過(guò)mime.getType(".css")
來(lái)獲取對(duì)應(yīng)的類型诉稍,進(jìn)而設(shè)置; - 給頁(yè)面設(shè)置代碼
fs.writeHeader(200,{"Content-Type":mime.getType(extname))
; - 配合path系統(tǒng)模塊使用最疆,獲取后綴名杯巨;
- 通過(guò)
- 第三方模塊formidable
- 用于在服務(wù)器端獲取form表單post提交的file文件數(shù)據(jù);
-
fs.rename(oldPath,newPath,function(err){})
:用來(lái)將相對(duì)路徑下的文件名修改為新的路徑下的文件名肚菠;
- 第三方模塊silly-datetime
- 用于將當(dāng)前時(shí)間轉(zhuǎn)化為具體格式的時(shí)間;
- 代碼:
sd.format(new Date(),"YYYY-MM-DD HH:mm:ss")
;
- 知識(shí)點(diǎn):
-
fs.readFile(path,callback)
中的path里的./public
代表的是根目錄下的public文件夾罩缴,./
代表的根目錄蚊逢,與js文件的位置無(wú)關(guān); - form表單通過(guò)submit自動(dòng)提交數(shù)據(jù)箫章,不涉及跨域的情況烙荷,如html文件在63342端口號(hào)下打開,而form表單中action設(shè)置的域名端口號(hào)為8888檬寂,提交數(shù)據(jù)到8888的服務(wù)器终抽,不會(huì)出錯(cuò),服務(wù)器8888中無(wú)需設(shè)置跨域請(qǐng)求代碼桶至;
- jQuery中的ajax發(fā)送請(qǐng)求昼伴,若不在同一域名下發(fā)送請(qǐng)求,必須在服務(wù)器中設(shè)置跨域請(qǐng)求代碼镣屹;否則無(wú)法拿到服務(wù)器響應(yīng)的數(shù)據(jù)圃郊;
-
- express框架
- 設(shè)置靜態(tài)資源目錄:用于放置靜態(tài)文件,如css,js等女蜈;
- 代碼:
app.use(express.static("./static"))
持舆;其中./
代表的是根目錄;相當(dāng)于app.use("/",express.static("./static"))
;
- 代碼:
- 若請(qǐng)求的pathname為正則表達(dá)式伪窖;那么可以通過(guò)req.params來(lái)獲取小分組的數(shù)據(jù)逸寓;為對(duì)象,屬性名從0開始覆山,0對(duì)應(yīng)第一個(gè)小分組的數(shù)據(jù)竹伸;
- express自帶的正則功能:未定的用
:xxx
替代,通過(guò)req.params.xxx
獲却乜怼佩伤;聊倔、- 若有嚴(yán)格匹配的,執(zhí)行嚴(yán)格匹配生巡,不執(zhí)行正則功能匹配耙蔑;
- 若想執(zhí)行非嚴(yán)格匹配,可以在嚴(yán)格匹配中設(shè)置
next()
;
- 設(shè)置靜態(tài)資源目錄:用于放置靜態(tài)文件,如css,js等女蜈;
- ejs模板
- 服務(wù)器中必須設(shè)置默認(rèn)模板引擎為ejs;
- 代碼:
app.set("view engine","ejs")
;
- 代碼:
- express在使用ejs模板時(shí)孤荣,可以不引入ejs模塊甸陌,但必須下載ejs第三方模塊;
- 必須將ejs文件放在views文件夾下盐股;
- 服務(wù)器中必須設(shè)置默認(rèn)模板引擎為ejs;
第四天
- express創(chuàng)建的服務(wù)器中接收請(qǐng)求:
- 接收get請(qǐng)求數(shù)據(jù):
- 代碼:
req.query
; - 獲取類型為對(duì)象钱豁;
- 代碼:
- 接收post請(qǐng)求數(shù)據(jù):
- 普通數(shù)據(jù):body-parser第三方模塊;既可以獲取表單提交的數(shù)據(jù)疯汁,也可以獲取ajax表單提交的數(shù)據(jù)牲尺;
- 引入模塊:
const bodyParser=require("body-parser")
- 設(shè)置中間件:
//針對(duì)提交類型為:application/x-www-form-urlencoded app.use(bodyParser,urlencoded({extended:false}) //針對(duì)提交類型為:application/json; app.use(bodyParser,json())
- 通過(guò)req.body拿到前端通過(guò)post請(qǐng)求提交的數(shù)據(jù)幌蚊;
- 引入模塊:
- 大文件:formidable模塊谤碳;
- 普通數(shù)據(jù):body-parser第三方模塊;既可以獲取表單提交的數(shù)據(jù)疯汁,也可以獲取ajax表單提交的數(shù)據(jù)牲尺;
- 接收get請(qǐng)求數(shù)據(jù):
- express中use設(shè)置路由請(qǐng)求:
- use請(qǐng)求可以擴(kuò)充地址;地址不嚴(yán)格溢豆;可以用作接盤俠蜒简;
- 格式代碼:
app.use("/admin",function(req,res){})
-
req.originalUrl
:拿到的是:包括基本地址的所有請(qǐng)求地址; -
req.baseUrl
:拿到的是:基本地址/admin"漩仙,如路由地址相同搓茬; -
req.path
:拿到的是:不包括基本地址,也不包括參數(shù)的其余地址队他; -
req.url
:拿到的是:不包括基本地址的所有請(qǐng)求地址卷仑; - 代碼:
app.use("/admin",function (req, res) { //地址欄請(qǐng)求地址:http://localhost:8080/admin/aaa/bbb/index.js?name=guo&age=26 //1.req.url拿到的是/admin后面的地址; console.log(req.url);//打印結(jié)果:/aaa/bbb/index.js?name=guo&age=26 //2.req.originalUrl拿到真正的請(qǐng)求地址和傳給后臺(tái)的參數(shù)麸折; console.log(req.originalUrl);//打印結(jié)果:/admin/aaa/bbb/index.js?name=guo&age=26 //3.req.baseUrl拿到的是基本的地址系枪,與路由地址一致; console.log(req.baseUrl);//打印結(jié)果:/admin //4.req.path拿到的是除了基本地址的其他子子孫孫的路徑地址磕谅;(不包含基本地址私爷,也不包含參數(shù)) console.log(req.path);//打印結(jié)果:/aaa/bbb/index.js res.send("ok"); });
- 格式代碼:
- use請(qǐng)求可以擴(kuò)充地址;地址不嚴(yán)格溢豆;可以用作接盤俠蜒简;
- 請(qǐng)求中的回調(diào)函數(shù)參數(shù)
- next:當(dāng)同一個(gè)請(qǐng)求格式滿足多個(gè)同類型請(qǐng)求時(shí),會(huì)按著自上向下執(zhí)行膊夹,當(dāng)需要執(zhí)行第二個(gè)或下面的請(qǐng)求時(shí)衬浑,可以在第一個(gè)中設(shè)置
next()
,這樣就會(huì)再執(zhí)行下面代碼放刨;
- next:當(dāng)同一個(gè)請(qǐng)求格式滿足多個(gè)同類型請(qǐng)求時(shí),會(huì)按著自上向下執(zhí)行膊夹,當(dāng)需要執(zhí)行第二個(gè)或下面的請(qǐng)求時(shí)衬浑,可以在第一個(gè)中設(shè)置
第五天
- 相冊(cè)集實(shí)例
- 知識(shí)點(diǎn):
- 在ejs模板中引入css,js等靜態(tài)文件時(shí)工秩,必須加上斜杠"/";
- 在app.js路由設(shè)置中,嚴(yán)格的路由必須寫在非嚴(yán)格的路由前面助币;
- 服務(wù)器中可以設(shè)置兩個(gè)靜態(tài)資源目錄浪听;
- 在router.js文件中所有請(qǐng)求的匿名函數(shù);均要設(shè)置next,當(dāng)err情況下眉菱,設(shè)置next(),并阻斷程序執(zhí)行迹栓;
- 利用use來(lái)充當(dāng)接盤俠的角色;
- fs系統(tǒng)模塊
-
fs.unlink(path,function(err){})
:刪除指定路徑下的文件俭缓;不能是文件夾克伊;
-
- 注意:
- return:阻斷程序執(zhí)行,不能放在異步操作中华坦,否則不能阻斷下面程序的執(zhí)行愿吹,必須放在外面;如果放在異步操作的后面惜姐,不會(huì)阻止該異步操作犁跪;
- 知識(shí)點(diǎn):
第六天
- cookie
- 作用:將信息存儲(chǔ)在瀏覽器端,在服務(wù)器中攜帶信息傳遞歹袁;
- 沒(méi)有跨域限制坷衍;
- 插件:cookie-parser express;
- 設(shè)置:
- res負(fù)責(zé)設(shè)置存儲(chǔ)信息:
res.cookie("xxx","xxx",{})
;- maxAge設(shè)置存儲(chǔ)時(shí)間,httpOnly設(shè)置是否只允許http協(xié)議請(qǐng)求宇攻;
- 設(shè)置
signed:true
惫叛,防止篡改倡勇;
- req負(fù)責(zé)識(shí)別存儲(chǔ)信息逞刷;
req.cookies.xxx
;
- res負(fù)責(zé)設(shè)置存儲(chǔ)信息:
- 刪除cookie:
res.clearCookie("xxx")
; - 查找:在控制臺(tái)Application中Cookies中查找;
- 密鑰四步:secret:"密鑰";app.use(cookieParser("密鑰"))妻熊;signed:true夸浅;req.signedCookies;
- session
- 優(yōu)點(diǎn):
- 亂碼顯示,安全性比cookie高扔役;
- 在瀏覽器中通過(guò)設(shè)置一個(gè)亂碼id帆喇,然后在服務(wù)器中設(shè)置session數(shù)據(jù);
- 依賴:
- 依賴cookie亿胸,如果用戶在瀏覽器中禁用cookie后坯钦,session存儲(chǔ)的數(shù)據(jù)失效;
- 依賴express模塊
- 使用模塊:express-session模塊
- 需要設(shè)置中間件
- 設(shè)置和獲瘸扌:
- 設(shè)置:
req.session.xxx
; - 獲韧竦丁:
req.session.xxx
; - 刪除:
delete req.session
;
- 設(shè)置:
- 優(yōu)點(diǎn):
- webStorage;分為:localStorage和sessionStorage
- localStorage:本地存儲(chǔ)在瀏覽器中序仙;不能傳遞給服務(wù)器端突颊;
- 生命周期:只要通過(guò)setItem()設(shè)置后,在同一個(gè)瀏覽器中,就已經(jīng)存儲(chǔ)上律秃,不會(huì)消失爬橡,只能通過(guò)removeItem()或clear()來(lái)刪除;注意:同一個(gè)瀏覽器中不同的文件中棒动,都可以拿到存儲(chǔ)數(shù)據(jù)糙申,并對(duì)其進(jìn)行操作;
- localStorage:是類函數(shù)Storage的實(shí)例迁客,類的原型上存在多個(gè)方法郭宝,進(jìn)行本地存儲(chǔ)的操作;
- 私有屬性:length掷漱,指綁定key的個(gè)數(shù)粘室;
- 方法:setItem(key,value);getItem(key);removeItem(key);clear();key(索引值)
- 調(diào)用方法:
window.localStorage.setItem();
,其中window可以省略卜范;
- sessionStorage:本地存儲(chǔ)在一個(gè)會(huì)話中衔统,即一個(gè)頁(yè)面中;
- 生命周期:儲(chǔ)存在本窗口中海雪,其他窗口不能獲取锦爵,關(guān)閉窗口后,存儲(chǔ)的數(shù)據(jù)會(huì)銷毀奥裸;
- sessionStorage:也是類函數(shù)Storage的實(shí)例险掀,存在私有屬性和調(diào)用類函數(shù)的公共方法;
- 調(diào)用方法:
windos.sessionStorage.setItem();
;
- localStorage:本地存儲(chǔ)在瀏覽器中序仙;不能傳遞給服務(wù)器端突颊;
- mongodb數(shù)據(jù)庫(kù)知識(shí)
- 下載安裝mongdb時(shí)湾宙,連接超時(shí)樟氢,原因可能是防火墻關(guān)閉27017端口,可以短暫關(guān)閉防火墻或設(shè)置防火墻中允許訪問(wèn)27017端口侠鳄;
- mongodb與nodejs配合使用時(shí)埠啃,下載不同版本的mongodb模塊,使用不同的方式連接數(shù)據(jù)庫(kù)和獲取數(shù)據(jù)庫(kù)數(shù)據(jù)信息伟恶;
- mongodb新建本地?cái)?shù)據(jù)庫(kù)
- 代碼:
mongod --storageEngine mmapv1 --dbpath 數(shù)據(jù)庫(kù)存儲(chǔ)地址
;新建一個(gè)mmapv1格式的數(shù)據(jù)庫(kù)碴开; - 開機(jī):
mongod --dbpath 數(shù)據(jù)庫(kù)存儲(chǔ)地址
;
- 代碼:
- 數(shù)據(jù)庫(kù)插入多個(gè)數(shù)據(jù)的shell命令
- 代碼:
mongoimport --db 數(shù)據(jù)庫(kù)名字 --collection 集合 --drop --file 要導(dǎo)入的json數(shù)據(jù)的地址
- 注:導(dǎo)入的json文件數(shù)據(jù),每個(gè)對(duì)象之間不需要連接博秫,報(bào)紅是正常的潦牛;
- 代碼:
- 封裝mongodb庫(kù)時(shí)的注意點(diǎn):
- 查找數(shù)據(jù)時(shí),可以對(duì)數(shù)據(jù)進(jìn)行排序和分頁(yè)挡育,參數(shù)格式為:
{"sort":{"age":-1},page,pageamount}
; - 獲取數(shù)據(jù)總個(gè)數(shù)時(shí)巴碗,通過(guò)
col.countDocuments(function(err,count){})
;其中count為number類型,使用res.send(count)
會(huì)報(bào)錯(cuò)静盅,因?yàn)閟end中不能設(shè)置數(shù)字類型良价,可以通過(guò)toString()方法寝殴,轉(zhuǎn)化為字符串;
- 查找數(shù)據(jù)時(shí),可以對(duì)數(shù)據(jù)進(jìn)行排序和分頁(yè)挡育,參數(shù)格式為:
- mongoose知識(shí)
- mongoose為mongodb的進(jìn)化版明垢,相當(dāng)于原生JS和jQuery的關(guān)系蚣常;
第七天
- 登錄注冊(cè)項(xiàng)目
- 知識(shí)點(diǎn):
- 表單序列化:
$("form").serialize()
;獲取表單提交的數(shù)據(jù); - MVC:models views controllers
- 表單序列化:
- 知識(shí)點(diǎn):
- 留言板項(xiàng)目
- 知識(shí)點(diǎn)
- 刪除按鈕時(shí)痊银,通過(guò)獲取數(shù)據(jù)的
_id
值抵蚊,來(lái)進(jìn)行刪除;- 模塊:通過(guò)mongodb中的模塊ObjectID溯革;引入模塊
const ObjectID=require("mongodb).ObjectID
; - 查找數(shù)據(jù)filter:
{"_id":ObjectID(id)
; - 刪除數(shù)據(jù)成功后進(jìn)行重定向跳轉(zhuǎn)頁(yè)面:
res.redirect("/xxx")
;
- 模塊:通過(guò)mongodb中的模塊ObjectID溯革;引入模塊
- 刪除按鈕時(shí)痊银,通過(guò)獲取數(shù)據(jù)的
- 知識(shí)點(diǎn)
第九天
- 圖片裁切功能
- 軟件 GraphicsMagick
- 功能:可以修改圖片的類型和裁切大小
- 下載和安裝:安裝后配置環(huán)境變量贞绳,在全局下可以使用gm命令;
- 通過(guò)第三方模塊gm來(lái)對(duì)指定文件夾下的圖片進(jìn)行裁切處理致稀,前提是必須下載GraphicsMagick冈闭,才能使用gm
- 模塊:第三方模塊gm
- 代碼:
var gm=require("gm"); gm("./img/p1.jpg") .crop(550,450,400,5)//裁切圖片中的寬、高抖单、左邊距萎攒、上邊距; .resize(200, 200, "!")//其中"!"作用為:強(qiáng)制變?yōu)?00*200的文件矛绘; .write("./img/meinv2.jpg",function (err) { if(err){ console.log(err); }else{ console.log("ok"); } });
- 軟件 GraphicsMagick
- 圖片裁切實(shí)例
- 在網(wǎng)站上扒代碼耍休;
- 可以通過(guò)設(shè)置事件onSelect,在匿名函數(shù)中獲取參數(shù)c货矮,為一個(gè)對(duì)象羊精,對(duì)象中的數(shù)據(jù)為選中區(qū)域在原圖片中的寬,高囚玫,左邊距喧锦,上邊距等數(shù)據(jù);注:是比例變化前的大小位置劫灶;
- 必須設(shè)置全局變量裸违,才能獲得私有作用域中的數(shù)據(jù)掖桦;
- 預(yù)留的API接口:
- getBounds():獲取圖片實(shí)際尺寸本昏;
- getWidgetSize():獲取圖片顯示尺寸;
- getScaleFactor():獲取圖片縮放的比例枪汪;
- 網(wǎng)站鏈接:jQuery Jcrop 圖像裁剪;
第十天
- 論壇項(xiàng)目
- 知識(shí)點(diǎn):
- session的設(shè)置
- 判斷登錄與未登錄狀態(tài)涌穆;
- 攜帶session在路由中間傳遞數(shù)據(jù);
- session設(shè)置的位置:登錄成功后雀久,設(shè)置session宿稀;
- session的運(yùn)用:通過(guò)判斷session是否設(shè)置,來(lái)顯示導(dǎo)航欄中的元素赖捌;
- 設(shè)置:
- login: 布爾值祝沸;決定登錄和未登錄狀態(tài)矮烹,通過(guò)if條件判斷來(lái)顯示不同的元素;
- username: 用戶名罩锐,用于在數(shù)據(jù)庫(kù)中查找數(shù)據(jù)奉狈;和顯示用戶名;
- imgsrc:頭像的地址涩惑;顯示該用戶名實(shí)時(shí)的頭像地址仁期;
- 本地?cái)?shù)據(jù)庫(kù)中存儲(chǔ)數(shù)據(jù): 數(shù)據(jù)庫(kù):myforums
- 集合:users
- 內(nèi)容:1)用戶名;2)密碼竭恬;3)頭像圖片名跛蛋;
- 集合:contents
- 內(nèi)容:1)用戶名;2)評(píng)論痊硕;3)頭像圖片名赊级;4)發(fā)表時(shí)間;
- 集合:users
- 設(shè)置404頁(yè)面
- 只要是通過(guò)get請(qǐng)求提交的路由岔绸,都要注意此衅,是否需要設(shè)置404頁(yè)面;
- 404頁(yè)面可以通過(guò)判斷
req.session.login
是否存在亭螟,來(lái)進(jìn)行判斷挡鞍,當(dāng)不存在時(shí),設(shè)置next(); - 通過(guò)use來(lái)設(shè)置接盤俠预烙,渲染404頁(yè)面墨微;
- 設(shè)置靜態(tài)資源目錄
- 簡(jiǎn)易方式:
app.use(express.static("/public"))
,等同于app.use("/",express.static("./public"))
- 設(shè)置指定路由:
app.use("/avater",express.public("./mass"))
;即想要訪問(wèn)靜態(tài)資源目錄扁掸,必須加"/avater"前綴翘县;
- 簡(jiǎn)易方式:
- session的設(shè)置
- 注意點(diǎn):
- 修改頭像后,必須更新數(shù)據(jù)庫(kù)中兩個(gè)集合中的頭像地址數(shù)據(jù)谴分;更新成功后锈麸,必須更新session中設(shè)置的imgsrc;
- 知識(shí)點(diǎn):