课程名称: Node.js工程师养成计划
课程章节: Node 原生实战篇 - 项目基建 - 原生Node 开发Web 服务器
课程讲师: 北瑶
课程内容:
Node原生开发Web服务器
- 使用 Node.js 创建一个 HTTP 的服务器, 并能够接收到客户端发来的请求
- 获取到客户端具体的请求数据, 并根据不同的请求数据进行处理
- 将处理之后的结果, 响应会客户端, 并断开本次连接
使用Node.js创建HTTP服务器
// 引入http模块
var http = require('http');
// 创建服务器
var serve = http.createServer();
// 监听服务器端口
serve.listen(8000, function () {
console.log('http://127.0.0.1:8000')
})
// 请求处理函数function(形参1,形参2){}
// 形参1:request请求对象 获取到当前请求的路径,方法等本次请求的所有信息
// 形参2:response响应对象 发送响应数据
server.on('request', function(request, response) {
console.log('服务端收到客户端的请求啦!!!');
// 向客户端页面返回字符串
response.write("hello node");
// 结束响应
response.end();
});
服务器数据响应类型处理
- 乱码问题
因为我们的服务器接受请求处理并响应数据时,并没有指定响应数据的类型,所以出现了乱码;为了解决这个问题, 提供了setHeader
方法
server.on('request', function(request, response) {
// 设置响应头
response.setHeader('Content-Type','text/plain;charset=utf-8'); // 设置数据类型及字符集
// 向客户端页面返回字符串
response.write("赟赟");
// 结束响应
response.end();
});
html 解析问题
// 设置响应头
response.setHeader('Content-Type','text/html;charset=utf-8'); // 设置数据类型及字符集
但是我们不能一直将 html 代码写到服务器的方法中, 而是需要建一个 xx.html 文件, 将 html 文件中的内容返回给客户端
var http = require('http');
// 引入文件操作模块
var fs = require('fs');
var server = http.createServer();
server.on('request', function(request, response) {
// 读取html文件中的内容
fs.readFile('./xx.html','utf8',function(error,html_data){
// 设置响应头
response.setHeader('Content-Type', 'text/html;charset=utf-8');
// 将html中的内容响应回客户端,结束响应
response.end(html_data);
})
});
响应图片等其他静态资源
server.on('request', function(request, response) {
// url 属性返回请求的URL字符串
var urls = request.url;
if( urls =='/'){
fs.readFile('./xxx.html','utf8',function(error,html_data){
// 设置响应头
response.setHeader('Content-Type', 'text/html;charset=utf-8');
// 将html中的内容响应回客户端,结束响应
response.end(html_data);
})
}else if(urls.indexOf('jpg') != -1){ // 判断请求图片
fs.readFile('./xx.jpg',function(error,html_data){
response.end(html_data);
})
}
}
HTTP的不同请求方式处理
http.ServerRequest
并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作,譬如上传文件。而很多时候我们可能并不需要理会请求体的内容,恶意的 POST 请求会大大消耗服务器的资源。所以 Node.js 默认是不会解析请求体的,当我们需要的时候,只能手动来做。
获取请求类型
var url = require('url');
// 接收客户端向服务器发送的请求
serve.on('request', function (req, res) {
console.log('服务端收到客户端的请求啦')
// 获取请求类型
var method = req.method;
if (method == 'GET') {
url_obj = url.parse(req.url, true); // 解析get请求
console.log(url_obj.query);
console.log(url_obj.pathname);
} else if (method == 'POST') {
// 为了支持各种可能的 HTTP 应用,Node.js 的 HTTP API 是非常底层的。 它只涉及流处理与消息解析。 它把一个消息解析成消息头和消息主体,但不解析具体的消息头或消息主体。
var data = '';
// net 模块中的 net.Socket 提供的data及end事件
req.on('data', function (d) {
data += d;
console.log(data);
})
// 绑定end事件,监听数据接受完成
req.on('end', function () {
console.log(require('querystring').parse(data))
})
}
})
学习心得
通过本章的学习, 对前后端交互有的大致的了解