Nodejs 中 HTTP 模块使用方法
一、通过 http 模块构建一个简单的 http 服务程序
步骤:
1、加载http模块
var http = require('http');
2、创建http服务
var server = http.createServer();
3、监听用户的请求时间(require事件)
server.on('request',function(request,response){
//request 对象包含了用户请求报文中的的所有内容,通过request对象可以获取所有用户提交过来的数据。
//response 对象用来向用户响应一些数据,当服务器要向客户端响应数据的时候必须使用response对象。
//有了request 和 response 对象,就既可以获取用户提交的数据,也可以向用户响应数据了。
//body
response.write('Hello World!!!');
//对于每一个请求,服务器必须结束响应,否则客户端(浏览器)会一直等待服务器响应结束。
response.end();
})
4、启动服务
server.listen(8080,function(){
console.log('服务器启动了,请访问:localhost:8080');
})
二、通过服务器端设置响应报文头来解决乱码问题
var http = require('http');
var server = http.createServer();
server.on('request',function(request,response){
//解决乱码的思路:服务器通过设置 http 响应报文头,告诉浏览器使用相应的编码来解析网页
response.setHeader('Content-Type','text/plain;charset=utf-8');
response.write('Hello World!!!你好世界!');//此时中文会有乱码问题
response.end();
}
server.listen(8080,function(){
console.log('服务器启动了,请访问:localhost:8080');
})
三、通过设置 http 响应报文头来解决浏览器显示 html 的问题
var http = require('http');
var server = http.createServer();
server.on('request',function(request,response){
//解决乱码的思路:服务器通过设置 http 响应报文头,告诉浏览器
response.setHrader('Content-Type','text/html;charset=utf-8');
response.write('<h1>Hello World!!!你好世界!</h1>');
response.end();
}
server.listen(8080,function(){
console.log('服务器启动了,请访问:localhost:8080');
})
四、构建 http 服务程序 - 根据不同请求做出不同响应
var http = require('http');
var server = http.createServer();
server.on('request',function(request,response){
//request.url可以获取用户请求路径,根据不同的请求路径服务器做出不同的响应
console.log(request.url);
if(request.url=='/' || request.url=='/index'){
res.end('Hello Index!');
}else if(request.url=='/login'){
res.end('Hello Login');
}else if(request.url == '/register'){
res.end('Hello Register!');
}else{
response.end('404,not Found!');
}
}
server.listen(8080,function(){
console.log('服务器启动了,请访问:localhost:8080');
})
五、根据用户不同请求-读取不同 html 文件、图片
var http = require('http');
var path = require('path');
var fs = require('fs');
var server = http.createServer();
server.on('request',function(request,response){
if(request.url=='/' || request.url=='/index'){
fs.readFile(path.join(__diename,'htmls','index.html'),function(err,data){
if(err,data){
throw err;
}
response.end(data);
})
}else if(request.url=='/images/index.png'){
fs.readFile(path.join(__diename,'images','index.png'),function(err,data){
if(err,data){
throw err;
}
response.setHeader('Content-Type','image/png');//带图片的
response.end(data);
})
}else if(request.url == '/css/index.css'){
fs.readFile(path.join(__diename,'css','index.css'),function(err,data){
if(err,data){
throw err;
}
response.setHeader('Content-Type','text/css');//带css的
response.end(data);
})
}else{
//...
}
}
server.listen(8080,function(){
console.log('服务器启动了,请访问:localhost:8080');
})
六、模拟 Apache 服务器
var http = require('http');
var path = require('path');
var fs = require('fs');
var mime = require('mime');
http.createServer(function(req,res){
var publicDir = path.join(__dirname,'public');
var filename = path.join(publicDir,req.url);
fs.readFile(filename,function(err,data){
if(err){
res.end('文件不存在 404');
}
//通过第三方模块mime,来判断不同的资源对应的Content-Type的类型(npm install mime)
res.setHeader('Content-Type',mime.getType(filename));
res.end(data);
});
}).listen(9090,function(){
console.log('http://localhost:9090');
})
注意:对于服务器来说请求url就是一个标识符
七、request 对象 和 response 对象
request(http.IncomingMessage): 服务器解析用户提交的http请求报文,将结果解析到request对象中。
凡是要获取和用户请求相关的数据都可以通过request对象对象获取。
常用成员:
request.headers//键值对的形式
request.rawHeaders//数组的形式
request.httpVersion
request.method
request.url
response(http.ServerResponse):在服务器端用来向用户做出响应的对象。
凡是需要向用户(客户端)响应的操作,都需要通过 response 对象来进行。
常用方法:
response.write()
response.setHeader()
response.end()
response.writeHead()
response.statusCode = 404
response.statusMessage = 'Not Found'
八、npm
npm(node package manager,即node包管理器)
npm是node.js默认的软件包管理系统,安装完毕node后,会默认安装好npm
npm本身也是基于node.js开发的包(软件)
查看当前npm版本:npm -v
更新npm:npm install npm@latest -g//更新最新的。-g指的是全局安装(把这个模块全局安装之后,就可以将其作为命令行使用了)
全局安装只是为了可以当做命令行工具使用
常用命令:
install:安装包
uninstall:卸载包
version:查看当前版本
init:创建一个package.json文件。npm init
九、模块(Modules)和 包(Packages)的区别
1、模块可以是任何一个文件或目录(目录下可以有很多个文件),只要能被node.js通过require()即可
2、包是一个文件或目录(目录下可以有多个文件)必须有一个package.json文件来描述,就可以是一个包。
package.json就是一个包描述文件或项目描述文件-元数据
{"name":"包的名称(必须有)","version":"版本号(必须有)",....}
package-lock.json并不是每个人都会看到,npm5开始引进新的东西,为了让安装速度变快(第一次安装第三方包的时候才会产生)
十、获取用户提交的 get 数据 url 模块 parse()
要获取用户get提交的数据,需要用到url模块(这个模块是node.js内置模块,不是第三方模块)
既然是get提交数据,可以通过request.url就可以直接获取这些数据,但是这样使用起来不方便(得自己去截取字符串,然后获取想要的数据)
通过url模块,可以将用户get提交的数据解析成一个 json 对象,使用起来很方便。
十一、重定向
response.statusCode = 302;
response.statusMessage = 'Found';
response.setHeader('Location','/');
response.end();
十二、获取用户提交的 post 数据
因为post提交数据的时候,数据量可能比较大,所以会分多次进行提交,每次提交一部分数据。 因此,想要在服务器中获取用户提交的所有数据,就必须监听request事件的data事件。 因为每次浏览器提交一部分数据到服务器 那么,什么时候才表示浏览器把所有的数据都提交到服务器了呢? 就是当request对象的end事件被触发的时候。
var arr = [];
request.on('data',function(chunk){
//此处的chunk参数,就是浏览器本次提交过来的一部分数据
//chunk的数据类型是Buffer(chunk就是一个Buffer对象)
arr.push(chunk);
})
//监听request对象的end事件
//当end事件被触发的时候,表示所有数据都已经提交完毕
request.on('end',function(){
//在这个事件中只要把arr中的数据汇总起来就好了
//把arr中的每个buffer对象,集合起来转换为一个buffer对象
var postBody = BUffer.concat(arr);
//把获取到的buffer对象转换为一个字符串
postBody = postBody.toString('utf-8');
//把post请求的查询字符串,转换为一个 json 对象
//var querystring = require('querystring');
postBody = querystring.parse(postBody);
})
十三、工具函数库 underscore 使用
template(templateString,[settings]);//模版引擎
var _ = require('underscore');
var html = '<h2><%= name %></h2>';
var fn = _.template(html);
var text = fn({'name' : '哈哈'});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Nodejs 文件操作
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论