「多讀書多看報,少看視頻多睡覺。」在2015年即將結束之際,我把這句話做爲我2016年的我的簽名,但願它能時刻提醒我本身應該去好好讀書,查漏補缺,充實本身,遇到不清楚的漏洞就努力去弄懂弄通。html
在web開發的過程當中,我發現我對客戶端服務器的知識掌握還欠火候,雖然以前用socket.io寫了一個多人聊天窗口,可是我居然天真的覺得nodejs就是配置個package.json文件,而後再命令行裏執行npm install就OK了,簡直是「無鞋」。因此我以爲我有必要去好好看看http的工做原理和nodejs的應用了,本篇博客將持續更新我關於這方面學習的知識整理。node
-----------------------------------------------------------------------------------------------------------------------web
噹噹噹,事隔很久,九月(個人博客名)來繼續更新了,我想說我歷來沒有忘記我說過的話,只是塵世多誘惑,我只是個凡人,悲哉悲哉~~好了,廢話很少說,趕忙進入正題[我但是在15年的最後一天上班的最後2小時裏,用生命在拼命地趕忙寫哇!]npm
前幾天,接收同事一個項目,增長一個需求而後改改bug,而後九月我就懵了,真的懵了,內心一羣有一羣羊駝奔過,由於我只是個小小實習生,我都不會nodejs,但是咱們的項目高大上的運用了各類先進技術,關鍵是仍是人家寫的,苦命的我光看懂人家的代碼就要了半條命,固然我吐槽得有點過了哈,個人師父但是至關的好的,隨時答疑,師父說了,讓你接手這個項目呢是一種在壓力下的歷練,沒有壓力就沒有動力嘛,嗯~~師父說得好!小夥伴們也是哦,不要怕不會,學嘛!因而乎在項目差很少完工,我又閒下來的時候,我又看了一遍《nodejs入門》http://www.nodebeginner.org/index-zh-cn.html?utm_source=ourjs.com,不能不說果真是「每次都有新體驗」。json
我就詳細說說我在邊看邊練的過程當中遇到的問題吧,這些問題其實上網搜搜就有,由於這本入門教材真的很是好,感受你們入門時好像都會像我同樣跟着練習,因而前人們早已把樹栽好了,固然我要作的就是把前人們栽的樹都彙集到一塊兒,供你們和本身反思總結。我就說最終版例子哦。服務器
1、提交表單的HTML代碼,表單屬性必須是enctype="multipart/form-data"才能夠上傳文件的網絡
在這裏給你們普及一下enctype這個屬性,這個屬性管理的是表單的MIME編碼,共有三個值可選: ①application/x-www-form-urlencoded (默認值) ②multipart/form-data ③text/plainapp
其中①application/x-www-form-urlencoded是默認值,你們可能在AJAX裏見過這個:xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 這兩個要作的是同一件事情,就是設置表單傳輸的編碼。在AJAX裏不寫有可能會報錯,可是在HTML的form表單裏是能夠不寫enctype="application/x-www-form-urlencoded"的,由於默認HTML表單就是這種傳輸編碼類型。而②multipart-form-data是用來指定傳輸數據的特殊類型的,主要就是咱們上傳的非文本的內容,好比圖片或者mp3等等。③text/plain是純文本傳輸的意思,在發送郵件時要設置這種編碼類型,不然會出現接收時編碼混亂的問題,網絡上常常拿text/plain和text/html作比較,其實這兩個很好區分,前者用來傳輸純文本文件,後者則是傳遞html代碼的編碼類型,在發送頭文件時才用得上。①和③都不能用於上傳文件,只有multipart/form-data才能完整的傳遞文件數據。socket
其實form表單在你不寫enctype屬性時,也默認爲其添加了enctype屬性值,默認值是enctype="application/x-www-form-urlencoded". 學習
2、例子裏的上傳用的nodejs插件formidable,結果報了這樣一個錯
根據錯誤日誌確定是在使用fs API時的錯誤,百度以後發現有前人已經解決了這個問題,具體解決方法是:
由於涉及到文件移動和複製,特別是跨磁盤的操做因此會報錯。最後upload處要作一些小小的修改,原來寫的是:
fs.renameSync(files.upload.path, "\tmp\test.png");
要改爲:
var is = fs.createReadStream(files.upload.path); var os = fs.createWriteStream("\tmp\test.png"); is.pipe(os); is.on('end',function(){ fs.unlinkSync(files.upload.path); });
因而問題就愉快地解決了。
3、我還想說說關於pathname也就是路徑的問題,若是按上面那樣寫的話,路徑就是絕對路徑,在磁盤的根目錄下,因此若是咱們想用相對路徑的話,能夠
一、在項目根目錄下建一個目錄upload,而後把加一段代碼:form.uploadDir='upload';,而後路徑都寫成('upload\test.png')
二、用__dirname屬性
4、在文件requestHandler.js中
form.parse(request, function(error, fields, files) { // 這裏要先判斷一下error,不然後面有可能產生「莫名其妙」的錯誤 if (error) throw error; // ... });
好了,遇到的主要問題也就這麼幾個吧。
這樣算是入門了吧,不過還有好些問題須要再去涉及和研究,近期打算看慕課網的教程http://www.imooc.com/learn/348
相關參考:https://cnodejs.org/topic/5039f346f767cc9a51fe1ab7
http://www.zgguan.com/doc/w3c/tags/att_form_enctype.asp.htm
最後,在新的一年裏,但願咱們你們都Good Good study,Day Day up!