server

文档:http://nodejs.cn/api/http.html#http_class_http_server

  • 根据文档知道server是http.createServer的返回值的类型
  • 所以server是http.Server的实例
  • 因此server拥有不少的方法和事件(详细看文档
  • 其中就request事件和listen()方法目前使用过

文档里的第一行:继承net.Server类
所以net.Server类有得方法和事件,server都有

net.Server文档:http://nodejs.cn/api/net.html#net_class_net_server

获取请求内容

get请求

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

    1. import * as http from "http";
    2. const server = http.createServer();
    3. server.on("request", (request, response) => {
    4. console.log("有人请求了");
    5. console.log(request.method)
    6. console.log(request.url)
    7. console.log(request.headers)
    8. response.end("hi");
    9. });
    10. server.listen(8888);

post请求

  • 向8888端口发送post请求
  • curl添加-v会把请求的内容打出来
  • 跟之前的demo发起请求的方式一样:curl -v -d “name=hasson” http://localhost:8888
  • -d “xxx:xxx” 就是post请求,xxx就是发过去的数据
  • request.on(‘data’,fn) 获取消息体
  • request.on(‘end’,fn) 拼接消息体
  1. import * as http from "http";
  2. import { IncomingMessage, ServerResponse } from "http";
  3. const server = http.createServer();
  4. server.on("request", (request: IncomingMessage, response: ServerResponse) => {
  5. console.log(request.url);
  6. const array = [];
  7. request.on("data", (chunk) => {
  8. array.push(chunk);
  9. });
  10. request.on("end", () => {
  11. const body = Buffer.concat(array).toString();
  12. console.log("body");
  13. console.log(body);
  14. response.end("hi");
  15. });
  16. });
  17. server.listen(8888);
  • chunk 可以理解为一小块数据
  • 因为每一个chunk都是一个Buffer,用Buffer这个类去连接之前的每一个chunk,连成一块数组

    (request,response)是什么

    找类

  • 根据文档,request是http.IncomingMessage的实例

  • 根据文档,response是http.ServerResponse的实例

    Requset

  • 拥有headers, method, url等属性

  • 从strea.Readable类继承了data/end/error等事件
  • 为什么不能直接拿到请求的消息体?跟TCP有关

    Response

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

  • 拥有statusCode等属性,可读可写
  • 继承了Stream ```typescript import * as http from “http”; import { IncomingMessage, ServerResponse } from “http”;

const server = http.createServer();

server.on(“request”, (request: IncomingMessage, response: ServerResponse) => { console.log(request.url); const array = []; request.on(“data”, (chunk) => { array.push(chunk); }); request.on(“end”, () => { const body = Buffer.concat(array).toString(); console.log(“body”); console.log(body);

  1. response.statusCode = 202;
  2. response.setHeader("x-token", "cc1sdaooq");
  3. response.write("1\n");
  4. response.write("2\n");
  5. response.write("3\n");
  6. response.write("4\n");
  7. response.end();

}); });

server.listen(8888);

``` 然后想服务器发送请求
image.png
所以你可以看到 这个响应的东西,都是可以修改的,意思是nodejs可以控制整个响应回去的东西。

如何在文档找到自己想要的api

比如:查找post请求例子中的request有什么api,request和response有什么用

  • 根据代码一步一步找

我们是先创建的一个http.server 所以先从 http.createServer();里面找
image.png
**

看到有request,点进去看看

image.png

看到request旁边的点进去看看,一般这种都是说明request继承自里面的类

所以request可以用**的所有属性
比如这些:**

image.png

又看到继承,点进去看看

image.png

发现这个类有close,end,data等事件,说明request可以直接用这些属性