【学习笔记-node】搭建一个最简单的服务

146 阅读6分钟

node 文档 nodejs.org/docs/latest…

搭一个最简单的node服务,整理了一下模糊的概念清晰了不少。

这是一个基于 Node.js 内置 http 模块实现的最小化 Web 服务,包含以下核心功能:
• ✅ 监听 3000 端口
• ✅ 响应所有 HTTP 请求
• ✅ 返回中文友好的 UTF-8 编码内容
• ✅ 设置标准 HTTP 状态码与响应头

// 1. 导入内置的http模块 不需要安装任何依赖
const http = require("http");

// 2. 创建一个服务实例(http.createServer)
// req  请求头 res 响应头

const server = http.createServer((req, res) => {
  // 4. 设置响应头
  //   res.writeHead 是 Node.js 中控制 HTTP 响应的关键方法,用于明确告诉客户端:
  //    1. ​请求是否成功​(通过状态码)
  //    2. ​如何解析返回的数据​(通过 Content-Type 等头部)
  res.writeHead(200, {
    "Content-Type": "text/html;charset=utf-8",
  });
  // 5. 响应内容
  res.end("hello world");

  // 其他类型的响应内容示例
  // res.writeHead(200, { "Content-Type": "text/html" });
  // res.end("<h1>Hello</h1>");

  // 处理不同路由
  // if (req.url === "/") {
  //   res.writeHead(200, { "Content-Type": "text/html" });
  // }

  // 打印日志
  // console.log(`收到请求:${req.method} ${req.url}`);
});

//  3. 监听端口号,启动服务
server.listen(3000, () => {
  console.log("服务启动成功");
});

运行步骤:

  1. 将代码保存为 server.js
  2. 终端执行:node server.js
  3. 打开浏览器访问(任选其一):

代码结构解释

模块导入

require('http') 调用 Node.js 内置的 HTTP 模块,无需安装任何依赖

创建服务器

http.createServer() 接收一个回调函数,该函数会处理每个 HTTP 请求 (文档 nodejs.org/api/http.ht…

- `req`:请求对象([IncomingMessage](https://nodejs.org/api/http.html#class-httpincomingmessage)) 包含请求方法、URL、请求头等信息
- `res`:响应对象([ServerResponse](https://nodejs.org/api/http.html#class-httpserverresponse))用于设置响应状态、头信息和内容

响应逻辑

res.writeHead(200, ...) 设置 HTTP 状态码和响应头

  1. 设置 HTTP 状态码
    200:表示 HTTP 响应状态码,这里设置为 200 表示请求成功(OK)。
    其他常见状态码:
    404:资源未找到
    500:服务器内部错误
    301:永久重定向
    401:未授权
  2. 设置响应头(Response Headers)
    'Content-Type': 'text/plain'
    定义响应内容的类型(MIME 类型),告诉客户端(如浏览器)如何解析返回的数据。
    text/plain:纯文本(默认按文本显示,不解析 HTML 或 CSS)。
    text/html:HTML 内容(浏览器会渲染为网页)。
    application/json:JSON 数据(常用于 API 响应)。
    image/png:PNG 图片。

端口监听

server.listen(3000, ...) 启动服务监听 3000 端口

关键API

http.createServer([requestListener])

作用:创建 HTTP 服务器实例
参数
requestListener:自动绑定到 'request' 事件的回调函数

res.writeHead(statusCode[, headers])

作用:发送响应头
注意:必须在 res.end() 前调用

server.listen(port[, host][, callback])

作用:启动 TCP 监听
默认 hostlocalhost(外部不可访问,需设置为 0.0.0.0 开放访问)

测试方法

方法 1:使用浏览器(最简单)

  1. 启动服务
    运行 node server.js 启动服务(控制台会显示 Server running at http://localhost:3000/)。
  2. 访问地址
    打开浏览器,输入地址:
    http://localhost:3000
    预期结果:页面显示纯文本 Hello World from Node.js!

方法 2:使用命令行工具(适合调试)

Windows/Linux/Mac 通用(需安装 curl)

curl http://localhost:3000

预期输出

Hello World from Node.js!

Windows 自带命令(无需安装)

# 获取响应内容
powershell -Command "(Invoke-WebRequest -Uri http://localhost:3000).Content"
# 或仅显示文本
curl http://localhost:3000

方法 3:使用 Postman(适合 API 测试)

  1. 打开 Postman
  2. 选择 GET 方法,输入 URL http://localhost:3000
  3. 点击 Send
    预期结果:在响应体(Body)中看到 Hello World from Node.js!

方法 4:用 Node.js 写客户端代码(编程式获取)

const http = require('http');

// 向本机服务发送 GET 请求
http.get('http://localhost:3000', (res) => {
  let data = '';
  
  // 接收数据片段
  res.on('data', (chunk) => {
    data += chunk;
  });

  // 数据接收完成
  res.on('end', () => {
    console.log('响应内容:', data); // 输出: Hello World from Node.js!
  });
});

关键验证点

进阶扩展:

基础扩展

需求代码修改位置示例代码片段
修改端口server.listen()
第一个参数
server.listen(8080, ...)
返回 HTML 内容修改响应头和内容res.writeHead(200, {'Content-Type': 'text/html'}); res.end('Hello')
处理不同路由在回调函数内判断 req.url``if(req.url === '/about') { ... }
添加请求日志在回调函数开头添加console.log(
re__q.metho__d{req.url})

处理不同请求方法

如果你想接收 POST 请求的内容,需修改服务端代码:

const server = http.createServer((req, res) => {
  if (req.method === 'POST') {
    let body = '';
    req.on('data', (chunk) => {
      body += chunk; // 接收 POST 数据
    });
    req.on('end', () => {
      console.log('接收到的 POST 数据:', body);
      res.end('Data Received');
    });
  } else {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello World');
  }
});

常见问题

  1. 端口占用错误
    若出现 Error: listen EADDRINUSE: address already in use,说明端口被占用,修改端口号即可
  2. 实时刷新
    修改代码后需要重启服务:Ctrl+C 停止服务,重新运行 node server.js
  3. 生产环境建议
    实际开发推荐使用 Express/Koa 等框架,处理路由、中间件等更便捷:

其他扩展补充

localhost和127.0.0.1

为什么打开浏览器访问(任选其一): • http://localhost:3000http://127.0.0.1:3000 为什么这两个任选1个就可以

localhost是一个域名,系统通过hosts文件将其解析为127.0.0.1。IPv4中,环回地址是127.0.0.1,而IPv6的环回地址是::1。因此,当用户访问localhost时,系统实际上将其转换为127.0.0.1。Node.js服务监听在指定的端口(如3000),当使用localhost或127.0.0.1时,都是指向本机的环回接口,所以服务会响应这两个地址的请求。

在本地开发环境中,http://localhost:3000http://127.0.0.1:3000 是等价的,因为它们的本质都是访问你本机(当前运行服务的计算机)。以下是具体原因:


1. localhost127.0.0.1 的关系

地址类型说明
localhost域名操作系统预定义的域名,直接映射到本机环回地址(默认指向 127.0.0.1)
127.0.0.1IPv4 地址保留的环回地址(Loopback Address),用于访问本机服务

底层逻辑
当你访问 localhost 时,操作系统会通过本地 DNS 解析将其转换为 127.0.0.1。
等价性
两者最终指向同一个目标——本机的网络接口。


2. 为何能访问到你的 Node.js 服务?

服务绑定
代码中 server.listen(3000) 默认绑定到 0.0.0.0:3000,表示监听本机所有网络接口(包括 127.0.0.1)。
环回接口
无论通过 localhost 还是 127.0.0.1,请求都会发送到本机的环回接口,触发服务响应。


3. 两者的使用场景差异

场景推荐使用原因
开发调试localhost更直观,开发者友好
脚本或工具访问127.0.0.1避免因 DNS 解析或 hosts 文件修改导致的意外问题
IPv6 环境[::1](IPv6 地址)如果服务监听了 IPv6 地址,需使用 http://[::1]:3000

4. 注意事项

hosts 文件修改
如果人为修改了系统的 hosts 文件(如将 localhost 指向其他 IP),则 localhost 和 127.0.0.1 可能不等价。
防火墙限制
某些防火墙可能限制环回地址的访问,但默认情况下不影响本地开发。
网络隔离环境
在容器化环境(如 Docker)中,可能需要特殊配置才能访问。


总结

• localhost 是域名,127.0.0.1 是 IP 地址,两者最终指向本机。
• 在本地开发中,任选其一即可访问服务,无需纠结差异。
• 若需允许其他设备访问你的服务,需绑定到局域网 IP(如 192.168.1.100:3000)或公网 IP。