在Node.js中,提供了http模块与https模块,专用于创建HTTP服务器,HTTP客户端,以及HTTPS服务器和HTTPS客户端,同事实现这些服务器端与客户端之中所需要进行的处理。
http服务器
引用http模块,调用http模块中的createServer方法,在createServer的回调函数中处理用户请求
创建http服务器
var http = require('http');
// 调用http模块中的createServer方法
// 在createServer的回调函数中处理用户请求
var server = http.createServer(function(req,res){
// 第一个参数是客户端的请求对象,
// 第二个参叔代表服务器相应对象
// 接受客户端请求时的其他他处理
});
server.listen(3000,"127.0.0.1");
request事件
// 可以监听http.createServer方法创建的服务器对象的request时间
// request表示接受到客户端请求时所需要处理
server.on('request',function(request,response){
// 第一个参数是客户端的请求对象,
// 第二个参叔代表服务器相应对象
console.log('')
})
listening事件
// 当对http服务器指定了需要监听的地址和端口后,服务器将立即开始监
// 听来自改地址及端口的客户端链接,这时触发该服务器的listening事件
// 可以通过监听http服务器对象的listening事件,并且指定该时间触发时
// 调用的回调函数的方法来指定http服务器开始监听时所需执行的处理
server.on('listening',function(){
// 回调函数为可选参数
console.log('服务器端开始监听')
});
close事件
// 这段代码中由于没有关闭http服务器,因此该服务器将一直监听来自于
// 指定地址及端口的客户端链接,应用程序将不会退出,当http服务器被关闭时
// 如果服务器尚未与任何客户端建立链接,应用程序将正常退出。
// 当http服务器被关闭后,将不再接受来自listen方法中指定的地址及端口号
// 的客户端链接。
// 可以使用客户端的close方法关闭该服务器
server.on('close',function(){
// 回调函数为可选参数
console.log('服务器已关闭')
})
error事件
// 在对HTTP服务器指定需要监听的地址及端口时,如果该地址及端口已被占用
// 将产生错误,触发服务器的error事件,可以通过对error事件设置回调函数
// 的方法来指定该错误产生时所需要执行的处理
server.on('error',function(e){
// 回调函数为可选参数
console.log(e)
console.log('服务器链接失败')
})
connection事件
// 当客户端与服务器端建立链接时,触发http服务器对象 connection事件
// 可以监听该事件并在该事件触发时调用的回调函数中指定当连接建立时所需要
// 执行的处理
server.on('connection',function(socket){
console.log('客户端连接已建立')
})
// 客户端会输出两次"客户端连接已建立",这是因为在浏览器访问http服务器时,
// 浏览器会发出两次客户端请求,一次是用户发出的请求,另一次是浏览器为页面在收藏夹
// 中显示图标(favicon.ico)而自动发出的请求
timeOut事件
// 在node中,将http服务器的默认超时时间设置为2分钟
// 当服务器超时时,触发该服务器对象的timeout事件
server.on('timeout',function(socket){
// socket为服务器端用于监听客户端请求的socket对象
})
setTimeout服务器超时事件
// 可以使用http服务器的setTimeout方法来设置服务器的超时时间
// 当该超时时间超过之后,客户端不可继续利用本次与HTTP服务器建立链接
// 下次向该服务器发出请求时必须重新建立连接
server.setTimeout(60*1000,function(socket){
console.log('服务器超时')
})
console.log(server.timeout) //可以查看服务器的超时时间
获取客户端信息
如下
var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req,res){
if(req.url !== '/favicon.ico'){
var out = fs.createWriteStream('./request.log');
out.write('客户端请求方法'+req.method+'\r\n');
out.write('客户端请求url'+req.url+'\r\n');
out.write('客户端请求头对象'+JSON.stringify(req.headers)+'\r\n');
out.end('客户端请求所用http版本'+req.httpVersion)
}
res.end();
})
server.listen(3000,"127.0.0.1");
运行代码,在应用程序的根目录下将创建一个request.log文件,打开该文件,显示如下
转换URL字符串与查询字符串
在node中,提供了一个url模块与Query String模块,分别用来转换完整URL字符串与URL中的查询字符串。
querystring.parse(str, [sep], [eq], [opaction])
我们用的时候,基本上后三个参数用默认的就好
这样当我们参数为username=luckFine & age=14 & sex = boy
那么当调用parse方法时querystring.parse(username=luckFine & age=14 & sex = boy)
结果就是
{
username : luckFine,
age : 14,
sex : boy
}
当客户端提交表单数据时,且表单中存在复选框时,提交的查询字符串存在类似username=luckFine & username=xiaoFan 这种形式的字符串,在使用parse方法后,这种形式的字符串将转化为对象中的一个数组。
{
username : [luckFine, xiaoFan],
age : 14,
sex : boy
}
反过来,querystring.stringify(obj)
可以将对象转化为一个查询字符串,例如
querystring.stringify({username : luckFine,age : 14,
sex : boy})
那么运行结果为 username=luckFine & age=14 & sex = boy
那么基于这个,在node中的url模块,专门于对完整的URL字符串进行转换。
在url模块中可以使用parse方法将url字符串转换为一个对象,根据URL字符串中的不同内容,该对象中可能具有的属性及含义如下
案例如下
相反,可以使用url模块中的format方法将URL字符串经过转换后的对象还原为一个URL字符串。
url.format(urlObj)
我们看一下在http服务器中解析url字符串的代码示例
var http = require('http');
var url = require('url');
var server = http.createServer(function(req,res){
if(req.url !== '/favicon.ico'){
res.write('')
var url_parts = url.parse(req.url);
switch (url_parts.pathname) {
case '/':
case '/index.html':
res.write('您正访问的是首页
')
break;
default:
res.write('您正访问的是'+url_parts.pathname+'