使用node手写一个http服务

20 阅读2分钟

在平时的开发和练习的时候,我们通常会使用一些框架去run一个后台的服务,比如常见的koa, express之类的服务端框架,

今天我变基于原生的http模块去实现一个简单的服务。

  1. 导入模块
	const http = require("http");  

	const url = require("url");

这里导入了Node.js的httpurl模块。http模块用于创建HTTP服务器,而url模块用于解析URL。
2. 创建HTTP服务器

	http.createServer((req, res) => { ... }).listen(98, () => { ... });

使用http.createServer方法创建一个新的HTTP服务器。这个服务器接受一个回调函数,该回调函数会在每次请求到达时被调用,并传入两个参数:req(请求对象)和res(响应对象)。

服务器使用.listen(98, ...)方法监听98端口。当服务器成功启动时,会调用提供的回调函数,并打印“98端口启动成功”。
3. 解析请求URL

	const { pathname, query } = url.parse(req.url, true);

使用url.parse方法解析请求URL,并将解析后的结果解构为pathname(路径名)和query(查询字符串)。这里传入的第二个参数true意味着查询字符串应该被解析为一个对象,而不是一个字符串。
4. 处理POST请求

	if (req.method === "POST") {  

	  ...  

	}

如果请求方法是POST,则执行以下代码块。

  • 如果路径名是/login,则创建一个空字符串data来存储请求体数据。
  • 监听data事件,当接收到请求体的数据块时,将其追加到data字符串中。
  • 监听end事件,当请求体数据接收完毕时,设置响应头Content-Typeapplication/json,设置状态码为200,并发送响应,响应体为接收到的请求体数据。

如果路径名不是/login,则返回404状态码和响应体“404”。
5. 处理GET请求

	else if (req.method === "GET") {  

	  ...  

	}

如果请求方法是GET,则执行以下代码块。

  • 如果路径名是/get,则打印查询字符串对象query,并发送响应体“GET”。

如果路径名不是/get,则返回404状态码和响应体“404”。

完整的node.js代码如下

const http = require("http");
const url = require("url");

// 使用原生开发一个http服务器
http
  .createServer((req, res) => {
    // 序列化为对象
    const { pathname, query } = url.parse(req.url, true);
    console.log(pathname);
    if (req.method === "POST") {
      if (pathname === "/login") {
        let data = "";
        req.on("data", (chunk) => {
          data += chunk;
        });
        req.on("end", () => {
          res.setHeader("Content-Type", "application/json");
          res.statusCode = 200;
          res.end(data);
        });
      } else {
        res.statusCode = 404;
        res.end("404");
      }
    } else if (req.method === "GET") {
      if (pathname === "/get") {
        console.log(query);
        res.end("GET");
      } else {
        res.statusCode = 404;
        res.end("404");
      }
    }
  })
  .listen(98, () => {
    console.log("98端口启动成功");
  });

个HTTP服务器非常基础,主要用于演示如何使用Node.js的httpurl模块来创建一个简单的服务器,并根据请求方法和路径做出响应。在实际应用中,你可能需要添加更多的功能,比如错误处理、路由处理、中间件等。