Node.js中HTTP的小实战

工具安装

安装工具 ts-node-dev

这个工具可以用TypeScript开发Node.js程序,且会自动重启,但是不宜在生产环境使用,但非常适合用来学习

yarn global add ts-node-dev
复制代码

curl命令

 // GET请求
 curl -v url 
 // POST 请求
 curl -v -d "name=ade" http://localhost:8888/
复制代码

image-20210508090510161

构建项目

  • yarn init -y
  • 新建index.ts
  • 使用命令行或者WebStorm启动
  • yarn add –dev @types/node安装node声明文件
  • 引入http模块(WebStorm 自动导入)
  • 用http创建server (WebStorm 自动命名)
  • 监听server的request事件(可以简写)
  • server.listen(8888)开始监听8888端口
  • 使用curl -V http://localhost:8888发请求

启动应用

ts-node-dev index.ts
复制代码

server是什么

首先我们查看[中文文档](http | Node.js API 文档 (nodejs.cn))

http.createServer([options][, requestListener])
复制代码

在文档中可以发现serverhttp.Server类的实例同时继承了 net.Server类,它返回新的: <http.Server>实例。

option里面有IncomingMessageServerResponse比较重要的类。

IncomingMessage对象由 http.Serverhttp.ClientRequest 创建,并分别作为第一个参数传给 ‘request’ 和 ‘response’ 事件。 它可用于访问响应状态、消息头、以及数据。

ServerResponse此对象由 HTTP 服务器在内部创建,而不是由用户创建。 它会作为第二个参数传给 ‘request’ 事件。

在serve中使用较多的有

server.listen():启动 HTTP 服务器用于监听连接。

server.listen(7777); // 监听7777端口
复制代码

net.Server类中有几个使用较多的事件

‘error’ 事件:当错误出现的时候触发。,’close’ 事件不会在这个事件触发后继续触发,除非 server.close() 是手动调用。

GET请求

  • request.method获取请求动词
  • request.url获取请求路径(含 查询参数)
  • request.header获取请求头
  • get请求一般没有消息体/请求体

POST请求

data 和 end 事件继承自 stream.Readable 类,相关文档

request.on(‘data’ ,fn)获取消息体,当流将数据块传送给消费者后触发。

const readable = getReadableStreamSomehow();
readable.on('data', (chunk) => {
  console.log(`接收到 ${chunk.length} 个字节的数据`);
});
复制代码

request.on(‘end’ ,fn) 拼接消息体,当流中没有数据可供消费时触发。

const readable = getReadableStreamSomehow();
readable.on('data', (chunk) => {
  console.log(`接收到 ${chunk.length} 个字节的数据`);
});
readable.on('end', () => {
  console.log('已没有数据');
});
复制代码

request,response 是什么

request是http.IncomingMessage的实例,它可用于访问响应状态、消息头、以及数据,,通俗讲就是请求的所有信息。

根据文档

拥有headers、method、 url等 属性

// 请求头
request.headers()

// 请求的方式
request.method()

// 请求的路径
request.url()
复制代码

从stream.Readable类继承了data/end/error 事件

response是http.ServerResponse的实例,通俗讲就是响应的所有信息。

根据文档

拥有getHeader/setHeader/end/write等方法

 // 此属性控制在刷新响应头时将发送到客户端的状态码。 response.statusCode = 404;  // 为隐式响应头设置单个响应头的值。response.setHeader('Content-Type', 'text/html');  //这会发送一块响应主体。 可以多次调用该方法以提供连续的响应主体片段。 response.write()  //此方法向服务器发出信号,表明已发送所有响应头和主体,该服务器应该视为此消息已完成。 必须在每个响应上调用此 response.end() 方法。 response.end('xxx');
复制代码

拥有statusCode属性,可读可写

继承了Stream,目前用不上

小小实战

匹配任意文件

// 获取路径名const {pathname, search} = url.parse(path);let fileName = pathname.substr(1);// 将相对路径解析为绝对路径,获取文件fs.readFile(p.resolve(publicDir, fileName), ()=>{})
复制代码

设置首页

let fileName = pathname.substr(1);if (fileName === '') {	fileName = 'index.html';}
复制代码

非GET请求设置

if (method !== 'GET') {    response.statusCode = 405;    response.end();    return;}
复制代码

设置缓存

Cache-Control 通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制。

MDN相关文档

response.setHeader('Cache-Control', 'public, max-age=31536000');response.end(data);
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享