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("服务启动成功");
});
运行步骤:
- 将代码保存为 server.js
- 终端执行:node server.js
- 打开浏览器访问(任选其一):
- http://localhost:3000
- http://127.0.0.1:3000
代码结构解释
模块导入
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 状态码和响应头
- 设置 HTTP 状态码
200:表示 HTTP 响应状态码,这里设置为 200 表示请求成功(OK)。
其他常见状态码:
404:资源未找到
500:服务器内部错误
301:永久重定向
401:未授权 - 设置响应头(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 监听
• 默认 host:localhost(外部不可访问,需设置为 0.0.0.0 开放访问)
测试方法
方法 1:使用浏览器(最简单)
- 启动服务
运行node server.js启动服务(控制台会显示Server running at http://localhost:3000/)。 - 访问地址
打开浏览器,输入地址:
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 测试)
- 打开 Postman
- 选择
GET方法,输入 URLhttp://localhost:3000 - 点击
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');
}
});
常见问题
- 端口占用错误
若出现 Error: listen EADDRINUSE: address already in use,说明端口被占用,修改端口号即可 - 实时刷新
修改代码后需要重启服务:Ctrl+C 停止服务,重新运行 node server.js - 生产环境建议
实际开发推荐使用 Express/Koa 等框架,处理路由、中间件等更便捷:
其他扩展补充
localhost和127.0.0.1
为什么打开浏览器访问(任选其一): • http://localhost:3000 • http://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:3000 和 http://127.0.0.1:3000 是等价的,因为它们的本质都是访问你本机(当前运行服务的计算机)。以下是具体原因:
1. localhost 和 127.0.0.1 的关系
| 地址 | 类型 | 说明 |
|---|---|---|
| localhost | 域名 | 操作系统预定义的域名,直接映射到本机环回地址(默认指向 127.0.0.1) |
| 127.0.0.1 | IPv4 地址 | 保留的环回地址(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。