既然nodejs是针对后台开发的,可以先试着用nodejs搭建一个简单的服务器。
在使用nodejs搭建服务器之前,我们要先了解nodejs封装好的的几个模块,知道这几个模块简单的使用:如下
接下来开始一步一步搭建的过程,对每一步搭建,提出现在的缺点,在进而继续修改,直到大体完成的功能较为全面的服务器:
(1)服务器的本职就是被其他人访问。当客户端请求服务器,服务器并把信息返还给客户端的过程中,双方要共同遵守http协议。nodejs已经帮我们把http协议封装为模块,我们引入便可以方便使用,即使你对http协议理解的还是很透彻也可以拿来就用。
a、引入http模块:var http = require('http');
b、调用http模块的createServer()方法来创建一个服务器。createServer()方法的参数是一个回调函数,如:(同时解释一下为什么使用回调函数)
c、创建监听
服务器必须永远运行,因为请求人很多,不保证在什么时间,所有只要有人请求,服务器就必须做出响应的回应。这样服务器就得永远的运行了。
服务是需要的监听的,服务器就类似一个超市,超市门口必须有个人来迎接客人,收钱,送客人。而服务器的监听就相当于那个随之恭候的人。
server.listen();
d、创建监听,需要有个端口号
一个服务器对外是会提供很多服务的,如web服务,邮件服务,游戏服务等。所以可以端来请求服务器时,需要
告诉服务器,我需要的是什么服务,这就要通过端口号来限制了。
一般来说有几个固定的默认端口号:
当然,端口号是我们可以随意改变,你看哪个数字顺眼,就可以使用什么最为端口号。
server.listen(8080);
第一阶段代码如下:
var http = require('http');
var fs = require('fs');
var urlLib =require('url');
var querystring = require('querystring');
var server = http.createServer(function(req,res){
console.log('有人链接我了');
res.write("aaaa");
res.end();
});
server.listen(8080);
上面程序处理最大的一个不足是:服务器不管客户端要的是什么都会给在页面上显示aaa,这跟一个老师不管学生是
什么阶层的,都交1+1=2是一样的。
你一个服务器有责任判断出客户端要的是什么,之后根据客户端要的内容,去返回,不可以乱返回。(那就跟听不懂
别人话的人一样,让大家无语,自然大家对它的好感度就没有了)
(2)第二阶段,让服务器可以判断出,客户端的需求是什么,之后根据客户端的需求,去返回内容。
首先,有一个属性返回的是,当前客户端请求的内容(如下图):
其实我们可以通过switch..case方法来判断客户端的需求,可是如果一个网站有很多请求的时候,那是很麻烦的一件事。
这里,我们可以使用fs这个文件操作模块。
和http一样,fs也是nodejs封装的一个模块,我们可以可以直接引入来使用。
先对文件操作中的读文件,和写文件进行下详细的讲解:
使用readFile()和writeFile()的代码实例:
fs.readFile('aaa.txt',function(err,data){
if(err){
console.log(err);
}else{
console.log(data);
}
})
fs.writeFile('bbb.txt','我把内容加载bbb.txt中',function(err,data){
console.log(null);
})
第二段改善代码如下:
var http = require('http');
var fs = require('fs');
var urlLib =require('url');
var querystring = require('querystring');
var server = http.createServer(function(req,res){
var file_name = './www'+req.url;
fs.readFile(file_name,function(err,data){
if(err){
res.write(404+"该页面不存在");
}else{
res.write(data);
}
res.end();
})
});
server.listen(8080);
第二阶段结束:此时的服务器可以判断出客户端请求的是什么,可以根据需求返回响应数据了,不在瞎返回了。
第三阶段:上面的阶段已经可以根据客户端的请求,而返回东西了。但是服务器还需要接受到客户端发送过来的数据,客户端向客户端提交数据的方法有,form表单、websocket、ajax、jsonp;无论前端以什么方法发送数据,对后台来说都是一样的。后端要的是个结果。不管你传来的方式。不过客户端的请求方式不同,后端的接受方法不太一样。
常用的请求就两种get,post;
GET请求:
我们可以通过对接收过来的url:http://localhost:8080/shenlu.html?me=111&psw=123
可以用req.url.indexOf('?'),split(),等方法将url处理为querysting如:me=111&psw=123类似这样样式。之后
在使用parse方法。
但这么处理是麻烦,所以就在这里就引用过来url模块
代码实例:
//get
const urlLib =require('url');
var obj=urlLib.parse(req.url,true);
var url=obj.pathname;
var GET=obj.query;
console.log(url);
POST请求:
post请求是分段发送的,为什么比一次性发送,而要分段:
1)如果数据量很大,当我们以post方式发送这写大量数据时候,此时其他的数据必须等待。等1G数据发送之后在发送
其他数据。
2)而且网络传输会出错,当一次性发送出去,就仅仅是一个字节出错,所有数据都需要重新发送。但是如果如果是分段
发送,哪个字节出错,我们就可以将哪一段重新发送。
注意两个注册事件,data,end;
data是一段数据达到,发送一段。 end是全部数据到达,要做的事情。
//post
var str='';
req.on('data',function(data){
str+=data;
})
req.on('end',function(){
const POST=querystring.parse(str);
console.log(url,GET,POST);
})
完整代码:
const http = require('http');
const fs = require('fs');
const urlLib =require('url');
const querystring = require('querystring');
var server = http.createServer(function(req,res){
var file_name = './www'+req.url;
fs.readFile(file_name,function(err,data){
if(err){
res.write(404+"该页面不存在");
}else{
res.write(data);
}
res.end();
})
//get
const urlLib =require('url');
var obj=urlLib.parse(req.url,true);
var url=obj.pathname;
var GET=obj.query;
//post
var str='';
req.on('data',function(data){
str+=data;
})
req.on('end',function(){
const POST=querystring.parse(str);
console.log(url,GET,POST);
})
});
server.listen(8080);