“多读书多看报,少看视频多睡觉。”在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!