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

栈里有风
2025-12-18 23:47
阅读 1795

写在前面:我是刚入职杭州某互联网公司(对,就是那个离网易园区走路十分钟、阿里西溪园区地铁三站的地方)的试用期前端小菜鸟。上周五晚上加班到十点,就因为一个“简单”的需求——后端同事甩锅说:“这个接口逻辑太轻了,你前端自己用 Node 写个 mock server 吧。”
我???我简历上明明只写了 Vue 和 React 啊!但转念一想:Node.js 这玩意儿,不就是 JavaScript 跑在服务端嘛?能有多难?
结果……三天后,我差点把 VSCode 里装的三十多个插件全卸了泄愤。

为什么我这个前端要学 Node.js?

别误会,我不是想转全栈(虽然 HR 在试用期谈话时暗示过“复合型人才更吃香”)。真正让我下定决心啃 Node 的,是上个月团队接到的一个新项目:给一个区块链数据可视化平台做前端展示层。

乍一听很酷——链上交易、智能合约调用、Gas 费波动曲线……但问题来了:这些数据从哪儿来?官方 API 限流严重,第三方节点又不稳定。产品经理拍脑袋说:“要不我们自己搭个轻量级中继服务,聚合数据再吐给前端?”

后端组大哥们正忙着搞高并发订单系统(双11预演压测刚炸了一次),根本没空搭理我们这个“玩具项目”。于是,这个光荣而艰巨的任务,落在了我——这个连 package.json 都还没写明白的新人头上。

行吧,为了不被试用期劝退,为了简历上能多一行“熟悉服务端开发”,也为了证明我 VSCode 里那堆插件不是白装的(比如 Thunder ClientESLintPrettier 全开,连写注释都自动格式化),我决定:从零开始,死磕 Node.js


别信“五分钟上手”,那是毒鸡汤

网上一堆教程标题写着《Node.js 5 分钟入门》,结果第一行代码就是 require('express')。拜托,连模块系统都没讲清楚,直接上框架?这跟教人开车先教漂移有什么区别?

我翻了三本书(对,就是那种纸质书,毕竟电子书在 VSCode 旁边分屏看会眼瞎):

书籍 优点 缺点 适合我这种菜鸟吗?
《Node.js 设计模式》 深入底层,讲事件循环、Stream 很透 太硬核,第一章就劝退
《Node.js 实战》 项目驱动,有完整电商案例 基于 Express 3.x,部分 API 已过时 ⚠️
《深入浅出 Node.js》 朴灵大佬写的,原理讲得飞起 2013 年出版,async/await 都没覆盖

最后发现,最有效的学习方式,还是边写边报错


第一步:Hello World 都能翻车?

新建一个 server.js,敲下经典代码:

const http = require('http');

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

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

运行 node server.js,浏览器打开 localhost:3000 —— 成功!我差点感动哭了。

但马上,现实给了我一巴掌:每次改代码都要手动重启服务器? 手指都快按断了 Ctrl+C + ↑ + Enter。

还好我 VSCode 插件没白装。立刻祭出 Nodemon

npm install -g nodemon
nodemon server.js

这下,文件一保存,服务自动重启。爽!生产力工具真的能救命,尤其是在 deadline 前夜。


引入 Express:别重复造轮子

原生 http 模块写路由简直反人类。GET、POST、参数解析、静态资源……每个都要自己拼。我试了半小时,光处理 /users/:id 这种动态路由就让我头大。

果断上 Express——Node.js 的“jQuery”,虽然老,但真香。

const express = require('express');
const app = express();

// 自动解析 JSON 请求体
app.use(express.json());

// 静态文件托管(比如前端 build 出的 dist)
app.use(express.static('public'));

app.get('/api/hello', (req, res) => {
  res.json({ message: 'Hello from Express!' });
});

app.listen(3000, () => {
  console.log('Express server running on port 3000');
});

重点来了:这里我踩了个坑。一开始没加 app.use(express.json()),前端发 POST 请求带 JSON 数据,后端一直拿不到 req.body。查文档才发现,Express 默认不解析请求体,得手动中间件挂载。文档,永远是你最好的朋友(比产品经理靠谱多了)。


真实场景:对接区块链节点

回到我的项目。我们需要从以太坊测试网(Goerli)拉取最新区块号和交易列表。

Node.js 有个超好用的库叫 ethers.js(比 web3.js 轻量、API 更友好)。安装:

npm install ethers

写个接口:

const { ethers } = require('ethers');

// 使用免费的 Infura 节点(记得去 infura.io 申请 key)
const provider = new ethers.providers.InfuraProvider('goerli', 'YOUR_INFURA_KEY');

app.get('/api/latest-block', async (req, res) => {
  try {
    const blockNumber = await provider.getBlockNumber();
    const block = await provider.getBlock(blockNumber);
    
    res.json({
      blockNumber,
      timestamp: block.timestamp,
      transactions: block.transactions.length
    });
  } catch (err) {
    console.error('Blockchain fetch error:', err);
    res.status(500).json({ error: 'Failed to fetch blockchain data' });
  }
});

线上事故预警:第一次部署到测试环境,Infura 的免费 tier 被我疯狂调用打爆了,返回 429 Too Many Requests。测试同学跑来问:“你这接口是不是写死循环了?”
我:……(内心 OS:这锅我不背,是产品经理非要实时刷新每秒一次!)

解决方案:加缓存!用内存缓存(node-cache)或者 Redis(但我们试用期项目没权限开 Redis 实例),先顶着。

const NodeCache = require('node-cache');
const cache = new NodeCache({ stdTTL: 10 }); // 缓存10秒

app.get('/api/latest-block', async (req, res) => {
  const cached = cache.get('latestBlock');
  if (cached) return res.json(cached);

  // ... fetch from blockchain ...
  cache.set('latestBlock', result);
  res.json(result);
});

调试技巧:别只会 console.log

作为前端,我习惯 Chrome DevTools。但在 Node 里,console.log 打印对象经常 [Object object],气死。

VSCode 救我狗命:直接按 F5,选 “Node.js” 环境,它会自动生成 .vscode/launch.json。然后在代码里打上断点,发起请求,程序就会停在断点处,变量值、调用栈、作用域一目了然

另外,日志分级也很重要。别所有信息都用 console.log,用 winstonpino 区分 info/warn/error。这样线上出问题,运维大哥不会骂你“日志全是垃圾”。


性能与安全:别让服务崩在试用期

作为一个要上线的服务,不能只跑通就行。我做了几件事:

  1. 错误统一处理:写个全局错误中间件,避免未捕获异常导致进程退出。
  2. CORS 配置:前端是 Vue SPA,部署在不同域名,必须允许跨域。
    const cors = require('cors');
    app.use(cors()); // 开发阶段宽松点,生产环境要限制 origin
    
  3. 限流防刷:用 express-rate-limit 限制 IP 请求频率,防止被人当免费区块链查询接口用。
  4. 环境变量管理:Infura Key、数据库密码等,统统放 .env 文件,用 dotenv 加载,绝不提交到 Git

最后:这玩意儿对前端到底有啥用?

说实话,学完 Node.js,我最大的感受不是“我会写后端了”,而是——终于理解了前后端联调时那些奇怪的 500 错误是怎么来的

以前看到 ECONNREFUSED 就慌,现在知道可能是服务没启动;看到 CORS error 不再甩锅给后端,自己就能配;甚至能帮测试同学写个脚本批量生成测试数据。

更重要的是,简历上终于能写“具备独立开发全栈原型能力”(HR 说这句在杭州互联网圈很加分)。

至于区块链?呵,项目上线后产品经理又说“用户反馈数据更新不够快”,打算换成 WebSocket 推送……行吧,下周学 socket.io


给 fellow 新人的建议

  • 别怕从原生模块开始:即使你最终用 Express/Koa,了解 httpfsstream 能让你 debug 时更有底气。
  • 善用 VSCode 调试器:比 console.log 高效十倍。
  • 日志和错误处理不是可选项:是生存技能。
  • 学 Node 不是为了取代后端,而是为了让自己在协作中更主动、更高效。

试用期还有两周结束。如果这篇教程能帮你少踩一个坑,那我这几天掉的头发就值了。

彩蛋:如果你也在杭州找工作,我可以偷偷告诉你——最近不少 Web3 项目在招“懂点 Node 的前端”,薪资开得挺猛。不过……先搞定试用期再说吧 😅

评论 0

最热最新
暂无评论
栈里有风Lv.1
0
影响力
0
文章
0
粉丝