Node.js新手教程:从零开始学习服务器端JavaScript —— 一个35岁成都老码农的自救实录

优雅的战士
2025-12-25 12:21
阅读 1599

作者:老陈,坐标成都,12年一线开发,月薪18k(税前),房租3500,老婆在国企,娃刚上幼儿园。


开头:那天晚上,我差点删了GitHub账号

去年十月的一个周五晚上,九点四十七分,我瘫在书房那张吱呀作响的电竞椅上——其实是拼多多99块买的二手办公椅,只是贴了个“电竞”标签自我安慰。老婆在客厅陪娃看《小猪佩奇》,厨房里炖着萝卜排骨汤,香味飘进来,但我一点胃口都没有。

手机突然震动,是前同事阿强发来的消息:“老陈,看到你GitHub上那个Node.js小项目了吗?有个外包客户要招人,急着上线一个后端API,会Node的话,日薪800,干不干?”

我盯着屏幕愣了三秒,心里五味杂陈。

因为——我根本不会Node.js。

我的主力语言是Java,Springboot写了快八年。每天和@Autowired、@RestController、MyBatis打交道,连做梦都在写mapper.xml。但最近两年,成都这边中小厂清一色转向“全栈化”,招人JD里动不动就是“熟悉Node.js/Express/Koa优先”,甚至有些岗位直接写“不要纯Java后端”。

更扎心的是,上个月面试一家做跨境电商的公司,HR问我:“你会写前端吗?Vue能搭Node服务吗?”
我老实回答:“我主攻后端,前端只会改个HTML。”
她笑了笑:“哦,那可能不太匹配,我们现在要求后端也能快速出MVP。”

回家路上,我坐在地铁7号线上,看着窗外霓虹闪烁的金融城,心里直打鼓:35岁了,还在写CRUD,技术栈十年如一日,是不是真的要被时代甩下了?

那晚,我打开GitHub,看着自己那个空荡荡的仓库列表——除了几个Springboot的demo,几乎全是fork别人的。一时冲动,鼠标移到右上角“Delete account”上,手都悬停了两秒。

但最终,我关掉了页面,新建了一个仓库,名字叫:nodejs-from-zero

我知道,该自救了。


转折:为什么选Node.js?而不是继续死磕Springboot?

说实话,一开始我是抗拒的。

毕竟Springboot是我吃饭的家伙。配置熟、生态稳、社区大,连报错信息我都背得出来:“Field xxx in required a bean of type ‘xxx’ that could not be found”——闭着眼都能修。

但现实很骨感:

  • 成都本地岗位趋势:拉勾、BOSS直聘上搜“后端开发”,60%以上要求“Node.js经验”或“JS全栈能力”。
  • 项目交付速度:外包和创业公司要的是快。用Springboot搭个REST API,光初始化Maven、配DataSource、写Entity就半天;而Node+Express,十分钟跑起来。
  • 前后端协作成本:我们组前端用Vue3 + TypeScript,如果后端也用JS,连数据格式、错误处理、日志规范都能统一,不用天天扯皮“你这返回的code为啥是字符串不是数字?”

最关键的是——我想保住这份工作

公司最近在裁员,虽然没轮到我,但老板开会时说:“技术栈单一的人,抗风险能力弱。” 那天散会后,我默默把电脑壁纸换成了“Learn or Die”。

于是,我给自己定了个目标:三个月内,用Node.js做出一个能跑的真实项目,并部署上线


实战:从“Hello World”到部署上线,我的踩坑日记

Day 1:装环境,差点被npm劝退

我用的是Mac(公司发的,2018款,内存8G,开IDEA就卡成PPT),先装Node.js。官网下LTS版,一路next。装完终端输node -v,出来v18.17.0,OK。

然后npm init -y,建了个server.js

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('成都老码农在此!\n');
});

server.listen(3000, () => {
  console.log('服务器跑在 http://localhost:3000');
});

运行node server.js,浏览器打开,成功!

那一刻,我居然有点小激动——原来JS真能写后端!

但很快翻车。我想装个Express,敲npm install express,结果网速慢得像乌龟爬,等了十分钟还卡在“fetchMetadata”。后来才知道,得切淘宝镜像:

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

搞定。从此,我对npm又爱又恨——包多是好事,但依赖地狱真不是盖的。

Day 7:对比Springboot,发现Node.js的“快”在哪

我用Springboot写过无数个用户查询接口,典型结构:

  • Controller → Service → Mapper → Entity
  • 配置application.yml
  • 加MyBatis Plus
  • 写DTO、VO做转换

光模板代码就上百行。

而用Express,同样功能:

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

app.get('/users/:id', (req, res) => {
  const { id } = req.params;
  // 模拟数据库查
  res.json({ id, name: '老陈', city: '成都' });
});

app.listen(3000);

不到10行,接口就通了。

当然,生产环境肯定不能这么糙。但这种“快速验证想法”的能力,对中小项目太友好了。我甚至用它给老婆做了个家庭记账小工具——前端Vue,后端Node+SQLite,周末两天搞定。

她试用后说:“比你之前用Springboot写的那个快多了。”
我苦笑:“那是,上次那个光启动就得45秒。”

Day 21:项目实战——做一个“成都程序员摸鱼指数API”

为了练手,我搞了个小项目:抓取本地招聘网站的Node.js岗位数量、平均薪资,结合天气、节假日,算个“摸鱼指数”(其实就是瞎编的算法)。

技术栈:

  • 后端:Node.js + Koa2(比Express更现代)
  • 数据库:MongoDB(文档型,适合快速迭代)
  • 部署:阿里云ECS(成都节点,月付98块)
  • 代码托管:GitHub(这次真没删)

过程中踩了无数坑:

  • 异步回调地狱:一开始用callback,三层嵌套后自己都看不懂。后来改用async/await,世界清净了。
  • 环境变量管理:本地用.env,线上用process.env,差点把MongoDB密码提交到GitHub(还好及时git rm --cached)。
  • 跨域问题:前端Vue devServer代理配错,调试两小时,最后发现是Koa-cors中间件没加credentials: true

最搞笑的是,有次半夜调试,日志一直报错“Cannot set headers after they are sent to the client”。查到凌晨两点,才发现是我在一个请求里调了两次res.send()——Node.js不像Springboot会帮你兜底,错了就是错了,直接崩。

但正是这些坑,让我真正理解了Node.js的运行机制:单线程、事件循环、非阻塞I/O。以前看文档觉得抽象,现在亲手写过,才懂什么叫“高并发靠的是异步,不是多线程”。

Day 60:部署上线,第一次收到外部请求

我把项目打包,用PM2守护进程跑在阿里云上:

pm2 start app.js --name "moyu-api"

域名绑了个免费的.xyz,Nginx反向代理。

上线那天,我让阿强帮我测试。他curl了一下:

curl https://chengdu-moyu-api.xyz/v1/index
# 返回 {"index": 72, "message": "今天适合摸鱼,但别太过分"}

他回我:“牛啊老陈,真上线了!”

那一刻,我坐在书房,窗外是成都十月微凉的夜风,心里却热乎乎的。不是因为技术多牛,而是证明了:35岁,还能学新东西。


反思:Node.js vs Springboot,到底该怎么选?

现在回头看,Node.js和Springboot根本不是“谁取代谁”的关系,而是适用场景不同

  • 用Node.js当

    • 快速原型/MVP
    • I/O密集型应用(聊天、实时通知、爬虫)
    • 前后端同构(比如Next.js/Nuxt.js)
    • 团队全是JS栈,不想维护多语言
  • 用Springboot当

    • 复杂业务系统(金融、ERP)
    • CPU密集型计算(虽然Node.js也能做,但得靠Worker Threads,麻烦)
    • 强事务、强一致性要求
    • 企业级监控、安全、审计需求高

我在公司内部推动了一个混合架构:核心交易系统继续用Springboot,但对外的开放API、内部工具平台,全用Node.js重写。结果呢?新功能上线速度提升40%,运维成本降了一半。

老板很高兴,年终给我涨了2k——虽然不多,但在成都,够娃半年兴趣班了。


给同样焦虑的老程序员几点建议

  1. 别怕“重复造轮子”:我学Node.js时,硬是手写了路由、中间件、数据库连接池。虽然Express都有现成的,但自己写一遍,理解深十倍。
  2. GitHub不是秀场,是成长记录本:哪怕代码烂,commit频繁,也能看出你的进步轨迹。我现在每周至少推一次。
  3. 工资低不是借口,时间才是资产:我在成都月薪18k,不如北上广25k,但房租便宜、生活节奏慢,反而有精力学习。每天晚饭后两小时,雷打不动。
  4. 技术没有“过时”,只有“不合适”:Springboot没死,Java也没死。但如果你只会一种,风险太高。T型人才,竖要深,横要宽。

结尾:35岁,不是终点,是新的起点

上周五,我又收到阿强消息:“有个新项目,用NestJS(Node.js的Angular风格框架),你要不要一起?”

我回了个“OK”,然后打开VS Code,新建了一个文件夹。

老婆探头问:“又加班?”
我说:“不,我在学新东西。”
她笑了:“你最近气色好多了。”

是啊,当你不再恐惧变化,焦虑就会变成动力。

35岁,在成都,工资不高,但心气不能低。
GitHub上多一个commit,简历上就多一分底气。
Springboot是我的老战友,Node.js是我的新伙伴。
它们不打架,它们一起帮我,在这个不确定的时代,稳稳地走下去。

共勉,各位还在一线敲代码的老兵。

P.S. 我的Node.js学习项目已开源:github.com/chengdu-oldcoder/nodejs-from-zero
欢迎Star,也欢迎提PR——毕竟,谁还不是个从零开始的小白呢?

评论 0

最热最新
暂无评论
优雅的战士Lv.1
0
影响力
0
文章
0
粉丝