← 返回知识宇宙
基础课程·入门

Node.js 演示教程:从“这东西跟我有关系?”到写完一个全栈应用

10 分钟 Node.js 实操教程,从识别电脑上已存在的 Node.js 开始,对比 npm 与 pnpm 的安装速度差异,使用内置 http 模块在 30 秒内启动一个 Web 服务器,再进阶用 pnpm + Express 在 60 行内完成一个支持增删改查的 Todo API,并演示 --watch、EADDRINUSE 报错处理以及 async/await 异步写法三个新手常见坑。

知识编号26
关系轨道0
学习难度入门
Node.jsExpresspnpmnpm后端开发API全栈应用入门教程
抖音

视频讲解

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"。回顾一下:

  1. 它是什么——让 JavaScript 跑出浏览器的运行时。Claude Code、Hermes、Dify 全跑在上面
  2. npm vs pnpm——npm 是超市,pnpm 是更聪明的超市,快 3 倍还不占硬盘
  3. Express API——60 行代码写一个能增删改查的后端
  4. 三个坑——--watch、EADDRINUSE、async/await

接下来你可以

Node 不是一夜学会的。但恭喜你——node server.js 能跑了,你就已经上路了。谢谢观看。

实践示例

后续与前置知识

暂无关联知识。

引用此知识点

更多基础课程知识