Node.js新手教程:从零开始学习服务器端JavaScript

云计算Tech
2025-12-18 07:48
阅读 2122

作者:老张,35岁,北京天通苑租房程序员,白天写业务代码,晚上和老婆抢Wi-Fi看剧。


上周五晚上十点半,我瘫在天通苑那套月租3500的两居室客厅沙发上,盯着电脑屏幕上一片红色的 npm install 报错,差点把键盘砸了。老婆在卧室喊:“你又在搞那个‘诺德’?饭都凉了!”
我叹了口气:“不是‘诺德’,是 Node.js……而且这玩意儿真不讲武德。”

这事得从去年十月说起。

那时我在一家做电商SaaS的小公司干全栈,月薪15k,勉强在北京活得像个人。但老板总说“我们要拥抱现代技术栈”,结果所谓的“现代”就是让我用 jQuery 写后台管理页,再套个 Bootstrap —— 2024年了,连 React 都没碰过。

直到有一天,新来的CTO(据说之前在字节待过)在站会上轻描淡写地说:“下个版本,前端用 React 重写,后端上 Node.js。两周内出 MVP。”

全组沉默。我偷偷看了眼隔壁工位的小李——985毕业两年,React 玩得飞起。而我?还在 varlet 之间反复横跳。

那天晚上回家,地铁十号线挤得像沙丁鱼罐头,我脑子里全是“MVP”、“微服务”、“同构渲染”这些词。到家洗完澡,老婆递来一碗泡面:“又加班?”
我说:“没,但我可能要失业了。”

一、为什么是 Node.js?

说实话,一开始我对 Node.js 有偏见。总觉得“JavaScript 写后端?不就是玩具吗?”
可现实打脸来得很快。

我翻了招聘网站,发现北京几乎所有要求“React 经验”的岗位,都顺带写着“熟悉 Node.js 优先”。更扎心的是,薪资中位数从我现在的 15k 直接跳到了 22k+。
技术栈决定工资条,这话一点不假。

更重要的是,Node.js 和 React 天然是一对。前后端都用 JavaScript,共享类型定义、工具链甚至部分逻辑(比如表单验证)。这对小团队来说简直是救命稻草——不用养两个语言栈的人。

于是我咬咬牙,拿出去年年终奖剩下的 8000 块,报了个线上训练营(别问,问就是“极客时间”),开始了我的 Node.js 自救之路。

二、从“Hello World”到跑通第一个项目

第一个周末,我在天通苑家里搭环境。Windows 10 + VS Code + Node v18.17.0。
node -v 输出版本号那一刻,我居然有点感动——毕竟这是我第一次正经装运行时,而不是靠公司运维给的 Docker 镜像。

照着教程敲:

// server.js
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello from TianTongYuan!');
});

server.listen(3000, () => {
  console.log('Server running on http://localhost:3000');
});

node server.js,浏览器打开 localhost:3000,一行字蹦出来。
我截图发朋友圈:“35岁,人生第一个后端服务上线。”
评论区全是“牛逼”、“大佬”,只有我知道——这离生产环境还差十万八千里。

真正让我崩溃的是 npm。
那天我想装个 Express(Node.js 最流行的 Web 框架),结果 npm install express 卡在 idealTree 转圈半小时。
后来才知道,天通苑的宽带晚上八点后就限速到 5Mbps,而 npm 默认源在国外。

解决方案?换淘宝镜像:

npm config set registry https://registry.npmmirror.com

瞬间丝滑。那一刻我悟了:在中国写代码,资源加速是基本生存技能。

三、用 React + Node.js 做个“待办清单”项目

光看教程没用,必须动手。我给自己定了个小目标:用 React 做前端,Node.js + Express 做后端,实现一个带增删改查的 Todo List。

后端部分(Node.js)

先建个文件夹 todo-api,初始化项目:

npm init -y
npm install express cors body-parser

然后写个最简 API:

// index.js
const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');

const app = express();
app.use(cors());
app.use(bodyParser.json());

let todos = [
  { id: 1, text: '学 Node.js', done: false }
];

// 获取所有任务
app.get('/todos', (req, res) => {
  res.json(todos);
});

// 新增任务
app.post('/todos', (req, res) => {
  const newTodo = { id: Date.now(), ...req.body };
  todos.push(newTodo);
  res.status(201).json(newTodo);
});

app.listen(4000, () => {
  console.log('API server running on http://localhost:4000');
});

跑起来,Postman 测试一下,OK。

前端部分(React)

另开一个终端,用 Vite 创建 React 项目(比 Create React App 快多了):

npm create vite@latest todo-frontend -- --template react
cd todo-frontend
npm install
npm run dev

然后在 App.jsx 里调用刚才的 API:

import { useState, useEffect } from 'react';

function App() {
  const [todos, setTodos] = useState([]);
  const [input, setInput] = useState('');

  useEffect(() => {
    fetch('http://localhost:4000/todos')
      .then(res => res.json())
      .then(data => setTodos(data));
  }, []);

  const addTodo = () => {
    fetch('http://localhost:4000/todos', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ text: input, done: false })
    })
    .then(res => res.json())
    .then(newTodo => {
      setTodos([...todos, newTodo]);
      setInput('');
    });
  };

  return (
    <div>
      <h1>我的待办清单</h1>
      <input value={input} onChange={e => setInput(e.target.value)} />
      <button onClick={addTodo}>添加</button>
      <ul>
        {todos.map(todo => (
          <li key={todo.id}>{todo.text}</li>
        ))}
      </ul>
    </div>
  );
}

export default App;

刷新页面,数据出来了!虽然丑得像2005年的网页,但它能跑

那一刻我激动得差点叫出声,老婆探头问:“你又中彩票了?”
我说:“比中彩票还爽——我的全栈应用跑起来了!”

四、踩过的坑与学到的资源

当然,过程绝非一帆风顺。这里分享几个血泪教训:

  1. 跨域问题:开发时前端 localhost:5173,后端 localhost:4000,浏览器直接 block 请求。解决方法就是前面用的 cors() 中间件。
  2. 热更新失效:改了后端代码要手动重启。后来学会用 nodemonnpm install -g nodemon,然后 nodemon index.js,自动重启。
  3. 环境变量管理:别把数据库密码写死在代码里!用 .env 文件 + dotenv 包。
  4. 日志太乱:加个 winstonpino,结构化日志,排查问题快十倍。

至于学习资源,我真心推荐这几个(亲测有效):

  • 官方文档:nodejs.org(英文好就别看中文翻译,滞后太多)
  • 免费视频:YouTube 上 The Net Ninja 的 Node.js 教程系列(有字幕)
  • 实战书:《Node.js实战》(人民邮电出版社,案例很接地气)
  • 社区:GitHub 上搜 “awesome-nodejs”,一堆精选库和工具

特别提醒:别一上来就学 Koa、NestJS。先把 Express 和原生 http 模块搞明白,再谈“高级框架”。基础不牢,地动山摇。

五、从项目到面试,再到涨薪

三个月后,我把这个 Todo 项目扩展成了一个带用户登录、数据持久化(用 SQLite)的小型任务管理系统,代码传到 GitHub,README 写得明明白白。

今年三月,我投了份简历,面试官看到我的项目,眼睛一亮:“你还自己搭了 RESTful API?”
我说:“是啊,连 JWT 鉴权都写了。”(其实只用了最简单的 token 验证)

最后 offer 拿到手:月薪 22k,还是远程办公两天。
跟老婆商量:“房租能不能涨到 4000?换个离地铁近点的一居室?”
她笑:“行啊,但你得保证别半夜还在敲‘诺德’。”

六、写给同样迷茫的你

35岁还在一线写代码,有人说我“卷”,有人说我“轴”。但我知道,技术人的安全感,从来不是年龄给的,而是解决问题的能力给的

Node.js 并不高深。它只是让 JavaScript 走出了浏览器,走进了服务器、命令行、甚至物联网设备。它的生态庞大而混乱,但只要你抓住主线——事件驱动、非阻塞 I/O、npm 模块化——就能在混沌中找到路径。

如果你也在焦虑:

  • 觉得自己年纪大,学不动新东西?
  • 怀疑 JavaScript 能不能扛起后端大旗?
  • 担心投入时间却看不到回报?

我想说:所有值得去的地方,都没有捷径。但每一步,都算数。

我现在的项目,前端用 React,后端用 Node.js + TypeScript,数据库用 PostgreSQL,部署在阿里云 ECS 上。虽然规模不大,但完整、可控、可迭代。这就是小而美的力量。

结语:代码之外,生活之上

写这篇文章时,窗外天通苑的夜色沉沉,远处立水桥地铁站的灯光还亮着。我知道,明天还有需求评审、还有 bug 要修、还有房贷要还。

但我不再害怕了。

因为当我能用几行 JavaScript 同时掌控前后端,当我的项目能真正帮到用户,当我的技术栈终于跟上了时代——
我就不再是那个只会改 bug 的“老码农”,而是一个能创造价值的工程师

Node.js 不是银弹,但它是一把钥匙。
打开的,不仅是服务器的大门,更是我们这些“高龄”程序员的职业第二春。

共勉。

—— 老张,于北京天通苑,2024年6月

评论 0

最热最新
暂无评论
云计算TechLv.1
0
影响力
0
文章
0
粉丝