大家好,我是前端西瓜哥,今天我们来学习 nodejs,用 nodejs 写一个简单 http 服务版本的 "hello world"。
http.createServer
我们需要用到 nodejs 的 http 模块。
http 模块包含了和 http 相关的一些方法,我们需要用到 http.createServer 方法,它用于创建一个 http 服务,并返回 http.Server 实例对象。
http.createServer 方法接受两个参数:
- 配置对象 options,可选。比如可以配置请求超时时间 requestTimeout。
- 监听请求函数,可选。当接收到请求时,我们可以通过该函数拿到请求对象 req 和响应对象 res。req 是http.IncomingMessage 实例对象,res 则是 http.ServerResponse 实例对象, http.ServerResponse 继承自 http.OutgoingMessage 类。
然后返回一个 http.Server 实例对象,http.Server 继承自 net.Server。
http 模块涉及相当多的类,需要注意区分。
对于 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 服务。
很简单。我们先用 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。