一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情。
http模块
http 模块是 Node.js 官方提供的、用来创建web 服务器和客户端的模块。
它提供了一系列的方法和属性,例如:
- http.createServer() 方法,用来创建一个web 服务器,从而对外提供web 资源
- http.request() 方法,用来发起 http 网络请求,请求其它web 服务器上的资源
如果要在 JavaScript 代码中使用 http 模块,则需要先导入它:
const http = require('http')
创建最基本的web服务器
创建web服务器的基本步骤有四步:
- 导入 http 模块
- 创建 web 服务器实例
- 启动服务器
- 为服务器实例绑定request 事件,监听客户端的请求
接下来我们创建一个基本的服务器。
// 1. 导入 http 模块
const http = require('http');
// 2. 创建 web 服务器实例
const server = http.createServer();
// 3. 启动服务器
server.listen(3000, () => {
console.log('my server start work');
});
// 4. 为服务器实例绑定 request 事件,监听客户端的请求
// 当客户端发送请求到服务器的时候,会触发这个事件
server.on('request', () => {
// 这里要处理客户端的请求
console.log('hello html');
});
Request请求对象
只要服务器接收到了客户端的请求,就会调用通过server.on('request', (req, res) => {}) 为服务器绑定的request 事件处理函数。 req是客户端提交过来的请求内容,如果想在事件处理函数中,访问与客户端相关的数据或属性,可以使用如下的方式:
接收req参数:
获取请求的地址: req.url
获取请求方式: req.method
获取请求头: req.headers
const http = require('http');
const server = http.createServer();
server.listen(3000, () => console.log('服务器开启了'));
// 下面注册请求事件,当客户端发来请求的时候,会触发这个事件
server.on('request', (req, res) => {
// req参数,request请求的意思。所有和请求相关的信息,都可以通过req对象获取到
// 请求行(请求方式、url)、头(...)、体(POST方式才有请求体,请求体就是客户端提交的数据)
// 获取请求方式 req.method
// console.log(req.method); // GET / POST
// 获取请求的url req.url
// console.log(req.url); //
/**
* 请求的地址 获取到的req.url
*
* localhost:3000/login.html /login.html
* localhost:3000 /
* localhost:3000/api/getbooks /api/getbooks
*/
// 获取请求头 req.headers ,得到一个对象
// console.log(req.headers);
// console.log(req.headers.Authorization); // 获取客户端携带的token
// 设置响应头和状态码
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8'
});
// 做出响应
res.end('hello web');
});
Request获取用户提交的get参数
Request获取用户提交的get参数步骤:
1、引入node核心模块中的url模块
2、使用url模块中的parse方法,url.parse()
参数1: url地址
参数2: 是否生成query参数对象
实例:url.parse(req.url, true).query
// 引入node核心模块中的url模块
const url = require('url')
const http = require('http');
const server = http.createServer();
server.listen(3000, () => console.log('服务器开启了'));
server.on('request', (req, res) => {
//使用url模块中的parse方法,第二个参数给true代表参数解析成query对象
let obj = url.parse(req.url, true).query
// 输出拿到的参数对象
console.log(obj)
res.end('hello web');
});
Request获取用户提交的post参数
post参数是以数据流的方式提交给服务器的所以无法一次性拿到所有参数。需要监听数据流事件:
data事件:有数据提交给服务器时触发
end事件: 所有数据提交完成时触发
步骤:
1、引入node核心模块中的querystring模块
2、定义一个空字符串变量,用于准备拼接参数
3、监听req的data事件,拼接参数。
4、监听req的end事件,处理参数并完成业务逻辑。
// 引入node核心模块中的querystring模块
const querystring = require('querystring')
const http = require('http');
const server = http.createServer();
server.listen(3000, () => console.log('服务器开启了'));
server.on('request', (req, res) => {
// 定义变量准备拼接参数
let str = ''
// 监听data事件,拼接参数
req.on('data', chunk => {
str += chunk
})
// end事件在所有数据提交完成时触发,监听end事件,开始处理参数。
eq.on('end', () => {
// 输出拼接好的参数
console.log(str)
// 使用querystring的parse方法把str转为对象
let obj = querystring.parse(str)
console.log(obj)
})
res.end('hello web');
});
Response响应对象
在服务器的 request 事件处理函数中,如果想访问与服务器相关的数据或属性,可以使用如下的方式:
设置res参数:
完成响应(可以配置页面输出的内容): res.end('hello html')
设置响应体: res.write('1234')
设置响应头: res.setHeader('Author', 'zhangsan')
设置响应状态码: res.statusCode = 200
综合性的设置响应状态码和响应头:
res.writeHead(200, {
'aa': 'bb'
'Author': 'zhangsan'
});
// 1. 加载 http 模块
const http = require('http');
// 2. 创建server 对象
const server = http.createServer();
// 3. 监听端口,开启服务器
server.listen(3000, () => console.log('my server running'));
// 4. 注册server的request事件,准备处理浏览器的请求
server.on('request', (req, res) => {
// req request 请求,通过req对象可以获取到所有和请求相关的信息
// res response 响应,通过res对象可以做出响应以及设置一些和响应相关的内容
// // 设置响应头
// res.setHeader('Content-Type', 'text/html; charset=utf-8');
// res.setHeader('Author', 'zhangsan'); // 自己设置响应头,不要用中文
// // 设置响应状态码
// res.statusCode = 200;
// 综合性的设置响应状态码和响应头的方法
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8',
'Author': 'zhangsan'
});
// write方法,也可以设置响应体,但是没有做出响应的意思,只是单纯的设置响应体
res.write('1234');
res.write('5678');
// res.end(响应体); // 做出响应
res.end('hello,你的请求我收到了');
// 做出响应之后,不能再有其他代码。
});
解决中文乱码问题
当调用 res.end() 方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要手动设置内容的编码格式:
res.setHeader('Content-Type', 'text/html; charset=utf-8');