用 nodejs 实现 http 服务版本的 hello world

2022-12-21 19:56:27 浏览数 (1)

大家好,我是前端西瓜哥,今天我们来学习 nodejs,用 nodejs 写一个简单 http 服务版本的 "hello world"。

http.createServer

我们需要用到 nodejs 的 http 模块。

http 模块包含了和 http 相关的一些方法,我们需要用到 http.createServer 方法,它用于创建一个 http 服务,并返回 http.Server 实例对象。

http.createServer 方法接受两个参数:

  1. 配置对象 options,可选。比如可以配置请求超时时间 requestTimeout;
  2. 监听请求函数,可选。当接收到请求时,我们可以通过该函数拿到请求对象 req 和响应对象 res。req 是 http.IncomingMessage 实例对象,res 则是 http.ServerResponse 实例对象, http.ServerResponse 继承自 http.OutgoingMessage 类。

然后返回一个 http.Server 实例对象,http.Server 继承自 net.Server

http 模块涉及相当多的类,需要注意区分。

代码语言:javascript复制
const http = require('http');

const server = http.createServer((req, res) => {
  // ...
})

对于 req 请求对象,我们可以拿到请求内容,比如:

  • req.headers :对象形式的请求头字段(key 会转换为小写);
  • req.method:请求方法,如 "Get"

对于 res 响应对象,我们可以通过它来设置响应信息,比如:

  • res.writeHead:writeHead 方法用于设置状态码(如 200)、状态消息(如 "OK")以及响应头字段。主要注意的是,有些头字段是 nodejs 自己加的,比如 date
  • res.setHeader:设置单个响应头字段,但必须在 res.writeHead 前执行;
  • res.getHeaders:返回最终设置出来的响应头对象,可用于调试;
  • res.write:设置响应体内容、编码类型,可以多次调用,新内容会接到末尾;
  • res.end:该方法表示响应头和请求体已经设置完成,响应就会发出去,这个方法是必须要调用的。可以传入内容参数设置响应体,相当于顺手再做了一下 res.write 的工作;

然后是 http.createServer 返回的 http.Server 实例对象。它用于控制了这个特定 http 服务,比如:

  • server.close :该方法可以关闭当前 http 服务。具体是先不再接受新的请求,然后正在处理的请求都处理完后,才真正关闭,并触发 close 事件;
  • server.listen:监听请求连接,常见的用法是指定一个端口号。

Hello World!

现在我们来实现一个会返回 Hello World! 的 http 服务。

代码语言:javascript复制
const http = require('http');

http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World!n');
}).listen(3200);

很简单。我们先用 http.createServer 创建一个 http 服务。

传入一个请求函数,这个函数会在发生请求时拿到 res 响应对象,然后使用 res.writeHead 设置状态码 200,以及必要的头字段。

我们返回的数据是纯文本类型,所以设置 Content-Type'text/plain'。这个需要根据你自己的需求选择 MIME,比如 HTML 用 text/html

然后用 res.end 表示设置完成,并带上 'Hello World!n' 作为响应体。

最后我们给 http.createServer 方法返回的对象执行 listen 方法,监听 3200 端口。

然后我们访问 http://localhost:3200/,就能看到 Hello World! 了。

结尾

Nodejs 提供了 http 模块,可以让我们比较便捷地创建 http 服务,但因为涉及到的类和 API 也比较多,所以实际上更多会使用封装后的Web 框架,比如 Express、Nestjs。

我是前端西瓜哥,欢迎关注我,学习更多前端知识。


0 人点赞