以前学过一片node工作没有用,忘了,趁这个春节在整理一片
第一章
快速塔建一个局哉网服务器
const http = require("http");
var server = http.createServer(function(req,res){
console.log('ok0');
res.end()
});
server.listen(3000,"192.168.1.113")
返回一个json
res.write("{'A':10}");
设置响应头
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
io 异步,凡是读文件的行为都会进入io操作,程序没有运行完被提前结束
示例1:
const http = require('http');
var server = http.createServer(function(a,b){
fs.readFile('./www'+req.url,function (err,data) {
if(err){
res.write(404)
}else{
res.write(data)
}
res.end()//res.end 放在这儿会读取完结束
})
//res.end().end()放在这儿文件还没有读完就执行到这儿了。提前终此程序
});
server.listen(80);
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
示例二:
凡是有读取文件的场所,都会进入io post发送也会当成数据段,
现在举例做一个静态文件的实例
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
原理是读取文件,读出文件的后缀名,根据文件后缀名返回数据类型
读取后缀名方法; path包有extname方法,使用方法:
var extname = path.extname(pathname);
读到方件设置后缀名初步想法做法是:
假设一个函数是生成后缀名
mime = getMime(extname)
res.writeHead(200,{"Content-Type":mime});
如查涉及到读json 生成json 会现读取文件成了异步,还没有读文件的时候就会返回undefig 解决方法回调函数
完整示例如下:
var http = require('http'); var fs = require("fs"); var url= require("url"); path = require("path"); var server = http.createServer(function(req, res){ var pathname = url.parse(req.url).pathname; if(pathname.indexOf(".")== -1){ pathname += "/demo.html"; } var fileUrl = "./" + path.normalize("./static/"+ pathname); var extname = path.extname(pathname); fs.readFile(fileUrl,function (err,data) { if(err){ res.writeHead(404,{"Content-Type":"text/html;charset=UTF8"}); res.end("404"); } getMime(extname,function (mime) { res.writeHead(200,{"Content-Type":mime}); console.log(mime); res.end(data); }) }); }); server.listen(3000,"127.0.0.1"); function getMime(extname,callback){ fs.readFile("./mime.json",function (err,data) { if(err){ throw Error("找不到mime.json"); return "text/html;"; } var mimeJSON = JSON.parse(data); var mime = mimeJSON[extname]||"text/plain" callback(mime); }) }
上传文件实战
原理利用 formidable
第一步安装formidable npm i formidable
第一步。实例化一个对象,对象打点parse 时就可以外理文件了,需要先设置上传路径,form.uploadDir = "./uploads";
var form = new formidable.IncomingForm();
//设置文件上传存放地址
form.uploadDir = "./uploads";
//执行里面的回调函数的时候,表单已经全部接收完毕了。
form.parse(req, function(err, fields, files) {
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
————————————————————————————————————————————————————————————————————————————————————————————————————————————
完整案例:
/** * Created by Danny on 2015/9/20 15:35. */ var http = require("http"); var formidable = require('formidable'); var util = require("util"); var fs = require("fs"); var sd = require("silly-datetime"); var path = require("path"); //创建服务器 var server = http.createServer(function(req,res){ //如果你的访问地址是这个,并且请求类型是post if(req.url == "/dopost" && req.method.toLowerCase() == "post"){ //Creates a new incoming form. var form = new formidable.IncomingForm(); //设置文件上传存放地址 form.uploadDir = "./uploads"; //执行里面的回调函数的时候,表单已经全部接收完毕了。 form.parse(req, function(err, fields, files) { //if(err){ // throw err; //} //console.log(util.inspect({fields: fields, files: files})); //时间,使用了第三方模块,silly-datetime var ttt = sd.format(new Date(), 'YYYYMMDDHHmmss'); var ran = parseInt(Math.random() * 89999 + 10000); var extname = path.extname(files.tupian.name); //执行改名 var oldpath = __dirname + "/" + files.tupian.path; //新的路径由三个部分组成:时间戳、随机数、拓展名 var newpath = __dirname + "/uploads/" + ttt + ran + extname; //改名 fs.rename(oldpath,newpath,function(err){ if(err){ throw Error("改名失败"); } res.writeHead(200, {'content-type': 'text/plain'}); res.end("成功"); }); }); }else if(req.url == "/"){ //呈递form.html页面 fs.readFile("./form.html",function(err,data){ res.writeHead(200, {'content-type': 'text/html'}); res.end(data); }) }else{ res.writeHead(404, {'content-type': 'text/html'}); res.end("404"); } }); server.listen(80,"192.168.41.36");
ejs 模板使用案例
//加载模板
var ejs = require("ejs");
// 产生模板
var str = "vvvvvvvvvvvvvvvvvvvvvvvv<%= a %>";
// 数据对象
var data = {
a : 6
};
//调用render 学渲染
var html = ejs.render(str,data);
console.log(html);
console.log("ok");
————————————————————————————————————————————————————————————————————————
完整示例:如下
var ejs = require("ejs"); var fs = require("fs"); var http = require("http"); var server = http.createServer(function (req,res) { fs.readFile("./static/hhh.ejs",function (err,data) { var template = data.toString() var dictionary = {a:6}; var html = ejs.render(template,dictionary); res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"}); console.log(html) res.end(html); }) }); server.listen(80,"127.0.0.1")
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
处理get 请求通常用url 模块
下面示例原理:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
var http = require('http');
//本功能示例演示get请求处理,原理是从:?分割 然后&在分,
// 然后利用obj[xx]=?方式增加在到对象
http.createServer(function(req,res){
var GET={};
if(req.url.indexOf('?')!= -1){
var arr = req.url.split('?');
var url = arr[0];
var arr2 = arr[1].split('&');
for(var i=0;i<arr2.length;i++){
//
var arr3 = arr2[i].split('=');
GET[arr[0]]=arr[1];
//类似于这样 get[a]=12
}
}
console.log(GET)
res.end();
}).listen(80,"127.0.0.1");
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
处理post 请求原理,通过数据段 += 将数据垒加在一起
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
示例代码!!!
var http = require('http');
http.createServer(function (req,res) {
var str="";
req.on('data',function (data) {
str +=data;
})
req.on('end',function(){
console.log(str)
});
res.end();
}).listen(80);