能跑起来的最小可行服务器仅需三行原生http代码,但处理POST、JSON、路由或静态文件时需手动实现流读取、编码、状态码等细节;req.method和req.url是判断请求的唯二可靠入口,中文响应须显式设置UTF-8编码,res.end()不可省略,监听端口应捕获错误以防静默失败。

能跑起来的最小可行服务器,用原生 http 模块三行代码就能搞定;但真要处理 POST、JSON、路由或静态文件,不加中间件或框架会很快卡在流读取、编码、状态码手动设置这些细节里。
用 http.createServer() 启动最简服务器
这是 Node.js 内置能力,无需安装任何包,适合快速验证环境或调试基础请求流程。
-
req.method和req.url是判断请求类型和路径的唯二可靠入口,别依赖req.path(它不存在) - 中文响应必须显式设置
res.setHeader('Content-Type', 'text/plain;charset=utf-8'),否则浏览器显示乱码 -
res.end()必须调用,否则客户端一直等待,连接不会关闭 - 监听端口时建议捕获错误:
server.listen(3000, err => { if (err) throw err; console.log('running') }),避免端口被占用时静默失败
示例(保存为 server.js):
const http = require('http');
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'text/plain;charset=utf-8');
if (req.method === 'GET' && req.url === '/') {
res.end('Hello from Node.js');
} else {
res.statusCode = 404;
res.end('Not Found');
}
});
server.listen(3000);
用 express 处理常见 Web 场景
原生 http 模块对 POST body、JSON 解析、路由分发、静态文件服务都需手动实现,express 把这些封装成一行配置。
ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。
-
npm install express后,app.use(express.json())和app.use(express.urlencoded({ extended: true }))是解析 POST 数据的标配,缺一不可 - 静态文件服务直接用
app.use(express.static('public')),路径是相对于当前工作目录,不是__dirname - 路由顺序很重要:通用路由(如
app.use('*', ...))必须放在具体路由(如app.get('/api/users', ...))之后,否则永远匹配不到 - 不要在
express中手动调用res.write()和res.end(),统一用res.send()或res.json(),否则可能重复发送响应头
示例片段:
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.get('/hello', (req, res) => res.send('Hi'));
app.post('/data', (req, res) => {
console.log(req.body); // 自动解析后的对象
res.json({ ok: true });
});
app.listen(3000);
VSCode 中运行与调试的实操要点
VSCode 不是 IDE,它靠配置才能把 Node.js 调试器真正用起来,否则只能靠 console.log 硬 debug。
- 按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(Mac),输入 “Debug: Create Configuration”,选 “Node.js” 自动生成.vscode/launch.json - 确保
launch.json中的program字段指向你的入口文件,比如"program": "${workspaceFolder}/server.js" - 在代码行号左侧点击设断点,按
F5启动调试——此时req和res对象可直接展开查看属性,比日志高效得多 - 如果终端报错
Cannot find module 'express',说明没在项目根目录运行,检查 VSCode 当前打开的是整个项目文件夹,不是单个文件
常见错误:POST 请求收不到数据
这不是 Express bug,而是 HTTP 协议层和客户端配合问题,90% 出现在请求头或数据格式不匹配。
- 前端用
fetch发 JSON 时,必须带headers: { 'Content-Type': 'application/json' },否则express.json()中间件直接跳过解析 - Postman 默认发
form-data,但express.urlencoded()只处理x-www-form-urlencoded,要改 Postman 的 Body 类型为 “x-www-form-urlencoded” 或启用extended: true - curl 测试时别漏掉
-H "Content-Type: application/json",且 JSON 字符串需用单引号包裹避免 shell 解析错误:curl -X POST -H "Content-Type: application/json" -d '{"name":"a"}' http://localhost:3000/data - 如果用了
app.use(express.json({ limit: '1mb' })),而 POST 数据超限,会静默返回 400,需检查err.status是否为 400
真正的麻烦不在写代码,而在确认「谁在发什么、以什么格式、中间有没有被截断」——抓包看请求原始内容,比翻文档更快。

















