工具安装

安装工具 ts-node-dev

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

  1. yarn global add ts-node-dev

curl命令

  1. // GET请求
  2. curl -v url
  3. // POST 请求
  4. curl -v -d "name=ade" http://localhost:8888/

45 Node.js HTTP模块浅析 - 图1

构建项目

  • 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发请求

启动应用

  1. ts-node-dev index.ts

server是什么

首先我们查看中文文档](http://nodejs.cn/api/http.html#http_class_http_server))

  1. 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 服务器用于监听连接。

  1. 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)获取消息体,当流将数据块传送给消费者后触发。

  1. const readable = getReadableStreamSomehow();
  2. readable.on('data', (chunk) => {
  3. console.log(`接收到 ${chunk.length} 个字节的数据`);
  4. });

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

  1. const readable = getReadableStreamSomehow();
  2. readable.on('data', (chunk) => {
  3. console.log(`接收到 ${chunk.length} 个字节的数据`);
  4. });
  5. readable.on('end', () => {
  6. console.log('已没有数据');
  7. });

request,response 是什么

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

根据文档

拥有headers、method、 url等 属性

  1. // 请求头
  2. request.headers()
  3. // 请求的方式
  4. request.method()
  5. // 请求的路径
  6. request.url()

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

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

根据文档

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

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

拥有statusCode属性,可读可写

继承了Stream,目前用不上

小小实战

匹配任意文件

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

设置首页

  1. let fileName = pathname.substr(1);
  2. if (fileName === '') {
  3. fileName = 'index.html';
  4. }

非GET请求设置

  1. if (method !== 'GET') {
  2. response.statusCode = 405;
  3. response.end();
  4. return;
  5. }

设置缓存

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

MDN相关文档

  1. response.setHeader('Cache-Control', 'public, max-age=31536000');
  2. response.end(data);