目录
1.1 什么是http模块
http模块是Node.js官方提供的,用来创建web服务器的模块。通过http.createServer()方法就可以将一台电脑变成Web服务器,提供对外的资源。
引入方式:
const http = require('http')
Node.js不需要IIS、Apache等第三方软件,通过Node.js提供的http模块,可以仅通过几行代码,就可以把普通电脑变为Web服务器。
1.2 服务器相关概念
1. IP地址
一台电脑对应一个IP地址
2. 域名和域名服务器
IP地址和域名一一对应,映射表存于DNS域名服务中
3. 端口号
1.3 http模块创建Web服务器
1. 创建步骤
- 导入http模块
- 创建http服务器实例
- 在实例绑定request事件,监听客户端请求
- 启动服务
// 导入http模块
const http = require('http');
// 创建服务器实例
const server = http.createServer();
// 通过on方法绑定request事件,监听客户端请求
// 需要传入两个参数,第一个是'requesr'字符串,第二个是监听的回调函数
server.on('request', (req, res) => {
// ...
})
// 服务器启动在指定端口, 并执行回调函数
server.listen(80,() =>{
// ...
})
2. req 请求对象
只要服务器接收到了客户端的请求,就会调用server.on()为服务器绑定request事件处理函数,如果想在事件处理函数中,访问客户端相关的数据或属性,可以使用如下方式:
const http = require('http');
const server = http.createServer();
server.on('request',(req) => {
// req是客户端请求对象,包含了一些客户端相关的属性和数据
const url = req.url; // 客户端请求url,端口号后的路径
const method = req.method;// 客户端请求的方法
console.log(`visit url is ${url}, and request method is ${method}`);
})
server.listen(8080,() => {
console.log('http server is running at http://127.0.0.1:8080');
})
把请求地址换成http://127.0.0.1:8080/index.html 、则会再次打印信息,由此可见,req的url属性只包含端口号后的路径
3. res响应对象
在服务器的request事件处理函数中,如果想访问服务器相关的数据或属性,可以使用如下方式:
const http = require('http');
const server = http.createServer();
server.on('request',(req,res) => {
const url = req.url;
const method = req.method;
const str = `visit url is ${url}, and request method is ${method}`;
// res.end 方法的作用:向客户端返回指定数据,并结束此次请求
res.end(str);
})
server.listen(8080,() => {
console.log('http server is running at http://127.0.0.1:8080');
})
4. 解决中文乱码问题
如果res返回的数据包含中文,返回到页面会出现乱码问题:
server.on('request',(req,res) => {
const url = req.url;
const method = req.method;
const str = `客户端访问的url是 ${url}, 请求的方法是 ${method}`;
// res.end 方法的作用:向客户端返回指定数据,并结束此次请求
res.end(str);
})
乱码问题解决:通过setHeader()方法手动设置内容编码格式:
server.on('request',(req,res) => {
const url = req.url;
const method = req.method;
const str = `客户端访问的url是 ${url}, 请求的方法是 ${method}`;
// 设置响应头'Content-Type', 内容为'text/html; charset=utf-8'
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.end(str);
})
返回字符串正常显示:
1.4 根据不同url响应不同html内容
动态响应内容步骤
const http = require('http');
const server = http.createServer();
server.on('request',(req,res) => {
const url = req.url;
let content = '<h1>404 Not Found</h1>';
if(url === '/' || url === '/index.html'){
content = '<h1>首页</h1>';
}else if(url === '/about.html'){
content = '<h1>关于页面</h1>';
}
res.setHeader('Content-Type', 'text/html;charset=utf-8');
res.end(content);
})
server.listen(8080,() => {
console.log('http server is running at http://127.0.0.1:8080');
})
默认根地址http://127.0.0.1:8080和http://127.0.0.1:8080/index.html 返回到结果都是一样的:
请求http://127.0.0.1:8080/about.html地址:
请求不存在但地址http://127.0.0.1:8080/abc.html :