Node.js 演示教程:从“这东西跟我有关系?”到写完一个全栈应用
10 分钟 Node.js 实操教程,从识别电脑上已存在的 Node.js 开始,对比 npm 与 pnpm 的安装速度差异,使用内置 http 模块在 30 秒内启动一个 Web 服务器,再进阶用 pnpm + Express 在 60 行内完成一个支持增删改查的 Todo API,并演示 --watch、EADDRINUSE 报错处理以及 async/await 异步写法三个新手常见坑。
视频讲解
Node.js 演示教程:从"这东西跟我有关系?"到写完一个全栈应用
视频时长:10 分钟 | 平台:YouTube | 目标观众:零基础,甚至不知道自己需不需要学 Node.js 前 3 分钟:让你彻底搞懂这东西跟你有什么关系。后面全是实操,每 15 秒屏幕必有变化。
开场 Hook(0:00 – 0:25)
【镜头:黑色终端,光标闪烁】
你装过 Claude Code 没?
npm install -g @anthropic/claude-code。 Hermes 呢?npm install -g hermes-agent。 Dify?pnpm install && pnpm dev。 这些你天天敲的命令,背后全是同一个东西——{{Node.js}}。 你不是在学它,你是已经在用它了。只是你自己不知道。 今天 10 分钟,我让你彻底搞懂它是什么、能帮你干什么、然后手把手写一个能跑的全栈应用。 打开你的终端,我们开始。
第一章 — 先搞清楚这东西跟你到底有没有关系(0:25 – 3:00)
章节引入
别急着写代码。先搞清楚一个问题:{{这东西到底能帮你干什么?}} 如果你用 AI Agent、搞 AI 开发、或者只会写前端想补后端——你绕不开它。
Demo 1.1:看看你电脑里已经装了啥
Screen
打开终端。我们就做三件事:看看 Node 装了没、版本是多少、npm 能不能用。
Command
node --version
npm --version
pnpm --version
which node
Output
v20.11.1
10.2.4
8.15.0
/Users/jason/.nvm/versions/node/v20.11.1/bin/node
Narration
三个命令。第一个
node --version——如果你的电脑装了 Claude Code、Hermes、OpenClaw 这些 AI Agent,那 Node 肯定在你电脑上,因为它们全是靠 Node 跑的。 第二个npm --version——npm 是 Node 自带的包管理器,全世界最大的代码仓库。你要什么功能,一条npm install就拿回来了。 第三个pnpm --version——pnpm 是 npm 的升级版,快 2-3 倍、省硬盘。2025 年之后的新项目,基本全用 pnpm 了。如果你还没装,npm install -g pnpm就行。 你可能从来没主动学过 Node.js,但它已经在你的电脑里了。你只是不知道而已。
Demo 1.2:npm 和 pnpm 到底什么区别?眼见为实
Screen
我们当场做一个对比。创两个空项目,分别用 npm 和 pnpm 装同一个包,看时间差。
Command
mkdir test-npm && cd test-npm && npm init -y && time npm install express
cd ..
mkdir test-pnpm && cd test-pnpm && pnpm init && time pnpm add express
cd ..
Output
# npm: added 65 packages in 4.2s
# pnpm: Packages: +65 done in 1.3s
Narration
同一个 Express 框架,npm 花了 4.2 秒,pnpm 花了 1.3 秒。这只是一个小包。大项目差更多。 而且 pnpm 不复制文件——所有的包存在一个全局仓库里,项目里只放快捷方式。你装 100 个项目,同一个包只占一份硬盘空间。 后面我们写项目,全用 pnpm。现在就装:
npm install -g pnpm。
本章小结
Node.js 已经在你的电脑上了。你用的 Claude Code、Hermes、OpenClaw 全靠它。npm 是代码超市,pnpm 是更聪明的超市。不用纠结——直接用 pnpm。
第二章 — 30 秒跑起你人生第一个服务器(3:00 – 5:00)
章节引入
写代码。不废话。我们现在就用 Node.js 的内置能力——不需要装任何第三方包——30 秒启动一个真正的 Web 服务器。
Demo 2.1:三行代码启动服务器
Screen
建项目文件夹,写一个 server.js,跑起来。
Command
mkdir my-server && cd my-server
cat > server.js << 'EOF'
const http = require("http");
const server = http.createServer((req, res) => {
res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
res.end("你好!这是你的第一个 Node 服务器!");
});
server.listen(3000, () => console.log("去浏览器打开 http://localhost:3000"));
EOF
node server.js
Output
去浏览器打开 http://localhost:3000
Narration
三行核心代码:
require("http")——加载 Node 内置的 HTTP 模块createServer——创建一个服务器,别人访问的时候执行这个回调listen(3000)——监听 3000 端口 就这三行。去浏览器打开http://localhost:3000,你看到了什么?一个网页。一个真正的 Web 服务器,你写的,30 秒。
Demo 2.2:用 curl 测一下,再加个路由
Screen
开第二个终端窗口(⌘T),跑 curl。第一个终端保持 server 在前台。
Command
curl http://localhost:3000
curl -i http://localhost:3000
Output
你好!这是你的第一个 Node 服务器!
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
...
Narration
curl就是终端里的浏览器。-i能看到 HTTP 状态码 200、响应头——一个完整的 HTTP 服务。
Demo 2.3:根据 URL 返回不同内容
Command
# Ctrl+C 停掉旧服务
cat > server.js << 'EOF'
const http = require("http");
const server = http.createServer((req, res) => {
res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
if (req.url === "/") return res.end("首页");
if (req.url === "/about") return res.end("关于我");
if (req.url === "/time") return res.end(`服务器时间: ${new Date().toISOString()}`);
res.writeHead(404);
res.end("404 没找到");
});
server.listen(3000, () => console.log("http://localhost:3000"));
EOF
node server.js
Command (第二个终端)
curl http://localhost:3000/
curl http://localhost:3000/about
curl http://localhost:3000/time
curl http://localhost:3000/notfound
Output
首页
关于我
服务器时间: 2026-07-27T...
404 没找到
Narration
看到了没?
req.url就是访问的路径。不同路径返回不同内容——这就是{{路由}}。任何 Web 框架的底层原理就这个。下一章我们用 Express,把这一堆if-else变成一行一个接口。
本章小结
Node 不需要任何第三方包就能写服务器。require("http") → createServer → listen,三板斧。req.url 做路由。30 秒从零到服务器,Python 和 Java 没这么快。
第三章 — 用 pnpm + Express 60 行写一个完整 Todo API(5:00 – 8:00)
章节引入
手写 if-else 太丑了。我们要用全世界最流行的 Node 框架——Express——把刚才的代码瘦到 1/10。同时用 pnpm 装包,体验速度快感。
Demo 3.1:pnpm 初始化项目
Screen
回到第一个终端,Ctrl+C 停掉旧服务。在 my-server 里初始化。
Command
pnpm init
pnpm add express
ls
Output
Packages: +65
Progress: resolved 65, reused 65, done in 1.2s
node_modules package.json pnpm-lock.yaml server.js
Narration
pnpm init生成 package.json——项目的身份证。pnpm add express装 Express,1.2 秒搞定。注意出现了pnpm-lock.yaml,这是版本锁文件——保证你跟同事装的版本一模一样。node_modules别手动改它,也别提交到 Git。
Demo 3.2:60 行写一个 Todo API
Screen
新建 app.js,把完整代码灌进去。
Command
cat > app.js << 'EOF'
const express = require("express");
const app = express();
app.use(express.json());
let todos = [
{ id: 1, title: "学会 Node.js", done: false },
{ id: 2, title: "用 Express 写 API", done: false },
];
// 获取全部
app.get("/api/todos", (req, res) => {
res.json({ count: todos.length, data: todos });
});
// 新增
app.post("/api/todos", (req, res) => {
const title = (req.body.title || "").trim();
if (!title) return res.status(400).json({ error: "title 不能为空" });
const todo = { id: Date.now(), title, done: false };
todos.push(todo);
res.status(201).json({ data: todo });
});
// 标记完成
app.put("/api/todos/:id", (req, res) => {
const todo = todos.find((t) => t.id === Number(req.params.id));
if (!todo) return res.status(404).json({ error: "不存在" });
todo.done = true;
res.json({ data: todo });
});
app.listen(3000, () => console.log("Todo API 跑起来了: http://localhost:3000"));
EOF
node app.js
Output
Todo API 跑起来了: http://localhost:3000
Narration
重点看几个东西:
app.use(express.json())——中间件,告诉 Express 自动解析 JSON 请求体。不然req.body是空的。:id——路径参数,Express 自动帮你解析,req.params.id直接拿到。res.json()——自动把对象转成 JSON 字符串返回,不用手写JSON.stringify。 60 行代码,一个完整的增删改查 API 就出来了。
Demo 3.3:用 curl 把接口全测一遍
Screen
第三个终端(第一个在跑 server,这里用新的)。
Command
curl http://localhost:3000/api/todos
curl -X POST http://localhost:3000/api/todos -H "Content-Type: application/json" -d '{"title":"部署到服务器"}'
curl -X PUT http://localhost:3000/api/todos/1
curl http://localhost:3000/api/todos
Output
{"count":2,"data":[{"id":1,...},{"id":2,...}]}
{"data":{"id":1761200000000,"title":"部署到服务器","done":false}}
{"data":{"id":1,"title":"学会 Node.js","done":true}}
{"count":3,"data":[...]}
Narration
GET 查、POST 增、PUT 改。全部跑通。你现在有一个能用的 API 了。把它接上数据库,就是真后端。
本章小结
pnpm add 装包比 npm 快 3 倍。Express 三板斧:app.get/post/put 注册路由,req.body 拿数据,res.json 返回。60 行就是一个完整的 API。
第四章 — 三个新手必踩的坑,我帮你先踩了(8:00 – 9:30)
章节引入
代码能跑 ≠ 没问题。三个坑,每个都让我崩溃过。花一分半帮你绕过去。
Demo 4.1:改了代码没生效?用 --watch
Screen
Ctrl+C 停掉,加 --watch 重启。在另一个终端改代码,看自动重启。
Command
node --watch app.js
Narration
Node 18 以上自带
--watch。改了代码自动重启,不用手动 Ctrl+C。以前还要装nodemon,现在不用了。
Demo 4.2:EADDRINUSE — 端口被占了
Screen
不关第一个 server,开新终端再跑一次 node app.js。
Command
node app.js
Output
Error: listen EADDRINUSE: address already in use :::3000
Narration
EADDRINUSE翻译:3000 端口被人占了。原因是上一个node --watch还在跑。 两种办法:lsof -i :3000找 PID 然后kill,或者直接换端口app.listen(3001)。别慌,这是最常见的报错。
Demo 4.3:回调地狱 vs async/await
Screen
展示两种写法的对比。
Command
cat > read-demo.js << 'EOF'
const fs = require("fs/promises");
// 新写法:async/await - 清晰、平铺、错误处理在一起
async function readFiles() {
try {
const [a, b] = await Promise.all([
fs.readFile("a.txt", "utf8"),
fs.readFile("b.txt", "utf8"),
]);
console.log(a.trim(), b.trim());
} catch (err) {
console.error("读取失败:", err.message);
}
}
readFiles();
EOF
echo "Hello" > a.txt && echo "World" > b.txt
node read-demo.js
Output
Hello World
Narration
老写法是回调套回调套回调,五层嵌套代码跟金字塔一样——{{回调地狱}}。新写法
async/await,代码平铺直叙,跟同步代码读起来一样。凡是 2017 年前的教程教你嵌套回调的,一律跳过。
本章小结
三件事:--watch 自动重启、EADDRINUSE 不要慌、异步只用 async/await。记住这三个,省 80% 的调试时间。
收尾:下一步往哪走(9:30 – 10:00)
总结
10 分钟,你从"这东西跟我有关系吗"走到了"我能写一个全栈 API"。回顾一下:
- 它是什么——让 JavaScript 跑出浏览器的运行时。Claude Code、Hermes、Dify 全跑在上面
- npm vs pnpm——npm 是超市,pnpm 是更聪明的超市,快 3 倍还不占硬盘
- Express API——60 行代码写一个能增删改查的后端
- 三个坑——
--watch、EADDRINUSE、async/await
接下来你可以
- 接数据库 → PostgreSQL + Prisma,数据持久化
- 部署上线 → Vercel 点几下就上去,或者 Docker 一套打走
- 团队协作 → 上 TypeScript,类型安全
- 追求性能 → Fastify 替代 Express
Node 不是一夜学会的。但恭喜你——node server.js 能跑了,你就已经上路了。谢谢观看。
实践示例
node --version 和 npm --version 检查 Node.js 与包管理器环境
用 Node 内置 http 模块三行核心代码启动一个 Web 服务器
根据 req.url 为 /、/about、/time 返回不同内容实现简单路由
用 pnpm add express 快速安装 Express,并对比与 npm 的耗时
60 行 Express 代码实现 Todo 的 GET/POST/PUT 接口
curl 命令测通 /api/todos 的查询、新增和标记完成
后续与前置知识
暂无关联知识。
引用此知识点
- FastAPI 接口开发 演示教程:从 Hello World 到一个完整 CRUD API相关
本文通过十个演示和最终实战,使用 FastAPI 官方教程风格,从三行代码的 Hello World 开始,逐步讲解路径参数、查询参数、请求体、Pydantic 校验、自动文档、异常处理、枚举类型、PUT/DELETE,并最终实现一个基于内存字典的完整 CRUD API,全程使用 TestClient 测试,无需启动服务器。
- HTTP 请求库 Requests 演示教程:从一次 GET 到稳健的下载客户端相关
本文通过 httpbin.org 实操演示 Python requests 库的 GET、POST、PUT、查询参数、请求头、状态码与异常、超时、会话 Session 和 HTTP 基本认证,最后编写一个带会话与超时的稳健客户端下载 pandas 官方泰坦尼克数据集。
- 命令行演示教程:10 分钟从图形界面走向键盘自由前置
面向零基础初学者的命令行实操教程,10 分钟从打开终端开始,讲解 Shell、Terminal、PATH 核心概念,演示文件系统操作、管道重定向与文本处理,并编写 Shell 脚本完成日志分析报告生成器。
- Docker 演示教程:一次打包,到处运行相关
面向初学者的 Docker 实操教程,10 分钟演示镜像与容器概念、Dockerfile 构建、Docker Compose 多服务编排、常用排错命令,并通过 Node.js + nginx + PostgreSQL 博客项目实战完成容器化部署。
- JavaScript 演示教程:先看懂运行,再加入 TypeScript前置
面向初学者的 JavaScript 与 TypeScript 入门教程,从浏览器 DOM 操作与函数数据处理入手,逐步引入 TypeScript 类型检查,并完成价格计算器从 JavaScript 到 TypeScript 的迁移。
- Python 基础教程 · 10 分钟上手实操课相关
面向零基础初学者的 Python 实操教程,10 分钟从安装运行开始,讲解变量与数据结构、函数与模块、文件 I/O 与异常处理,最后实战完成 CSV 数据分析小工具。
- 技术学习心法演示教程相关
五分钟技术学习心法演示:强调盯住问题而非版本号、学习前问三句话、将记忆外包给工具、与 AI 分工,并鼓励每日记笔记建立知识网络,从而不再惧怕新技术。
- IDE 演示教程:从毛坯房到编程超能力相关
面向初学者的 IDE 实操教程,10分钟演示 VS Code 从默认配置到高效开发环境的调教,涵盖 IDE 核心概念(智能补全与语言服务器)、按语言选择 IDE 与安装扩展、个性化 settings.json 配置、安装 GitLens 与 GitHub Copilot 等实用插件,以及团队级 .vscode 配置实战,实现效率提升。
- 数据库导论:12 分钟看懂整个数据库世界相关
面向零基础学习者的数据库导论教程,12分钟建立数据库世界地图,覆盖为何需要数据库、OLTP vs OLAP、9类数据库系统(关系型、键值、文档、宽列、图、搜索、时序、OLAP、向量)、SQL vs NoSQL、共同框架(Schema、数据类型、CRUD、持久化、索引)、对象存储与数据库的区别,以及程序如何通过 Driver、Connection Pool、ORM 连接数据库。