请写一篇关于【Node.js新手教程:从零开始学习服务器端JavaScript】的技术文章
作者:老张,30岁,前建材销售,现全栈开发新人,正纠结要不要回老家买房
去年十月的一个深夜,我坐在上海浦东一间月租3500的合租房里,盯着屏幕上一行红色的 Error: Cannot find module 'express' 发呆。窗外是陆家嘴永不熄灭的霓虹,而我,一个刚转行三个月的“高龄”程序员,正试图用 Node.js 搭建人生第一个后端服务——结果连包都装不上。
老婆在微信上发来消息:“妈说老家新楼盘开盘了,首付只要28万,问我们还回不回。”
我回了个“在忙”,然后默默把泡面碗推到一边,叹了口气。
一、从“卖瓷砖”到“写代码”:我的转行之路
2022年之前,我在一家建材公司做区域销售,月薪15k,五险一金齐全,但每天不是陪客户喝酒,就是在高速上赶路。直到某天,我看到大学室友——当年和我一起打《英雄联盟》的胖子——晒出他跳槽后的offer:前端工程师,月薪22k,远程办公。
“你也能学,”他喝了口啤酒,认真地说,“现在 React + Node.js 是主流,产品思维比技术深度更重要。”
这句话像一颗种子,埋进了我心里。那年我29岁,结婚两年,存款40万,房贷还没影。但我知道,如果再不转行,可能这辈子就困在“月底冲业绩”的循环里了。
于是,我辞职,报班,啃书,刷题。三个月后,靠着一个用 React 做的仿电商项目,我拿到了第一份开发岗offer——虽然只是外包,但起薪18k,够我在上海活下去。
二、为什么我要学 Node.js?
入职后,我发现一个问题:前端再炫,没有后端就是纸老虎。
我们的产品是一个社区团购小程序,前端用 React 写得飞起,但每次调接口都要等后端同事排期。有一次,产品经理急着要加个“用户签到领积分”功能,后端大哥说:“下周吧,现在在搞支付对账。”
我心想:这不就是个 CRUD 吗?我自己搞!
于是,我决定自学 Node.js——毕竟,JavaScript 都会了,服务器端还能难到哪去?
现实狠狠打了我脸。
三、Node.js 入门:从“Hello World”到崩溃边缘
第一步:环境搭建(别笑,真有人卡在这)
我按教程装了 Node.js(v18.17.0),打开终端输入:
node -v
返回 v18.17.0,心里一喜。接着:
npm init -y
生成 package.json,没问题。
然后安装 Express:
npm install express
结果报错:EACCES: permission denied。
我傻了。折腾两小时才发现,是因为之前用 sudo 装过全局包,导致权限混乱。最后按 Stack Overflow 的建议,重装了 nvm,才搞定。
教训:别乱用 sudo!尤其当你还是个“人肉脚本执行器”的时候。
第二步:写个最简单的服务器
新建 server.js:
const express = require('express');
const app = express();
const PORT = 3000;
app.get('/', (req, res) => {
res.send('Hello from Node.js! 我终于能跑起来了!');
});
app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
运行:
node server.js
浏览器打开 http://localhost:3000,页面显示文字——那一刻,我差点哭出来。不是因为多难,而是因为我真的做到了。
第三步:连接数据库(MongoDB + Mongoose)
产品需求来了:用户签到要记录日期、积分、连续天数。
我选了 MongoDB(因为 JSON 格式友好,适合新手),用 Mongoose 做 ODM。
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/group-buy', {
useNewUrlParser: true,
useUnifiedTopology: true
});
const userSchema = new mongoose.Schema({
userId: String,
checkInDates: [Date],
totalPoints: { type: Number, default: 0 }
});
const User = mongoose.model('User', userSchema);
然后写个 POST 接口:
app.post('/checkin', async (req, res) => {
const { userId } = req.body;
let user = await User.findOne({ userId });
if (!user) {
user = new User({ userId });
}
// 简化逻辑:今天没签到就加
const today = new Date().toDateString();
if (!user.checkInDates.some(d => new Date(d).toDateString() === today)) {
user.checkInDates.push(new Date());
user.totalPoints += 10;
await user.save();
res.json({ success: true, points: user.totalPoints });
} else {
res.json({ success: false, message: '今天已签到' });
}
});
测试时,Postman 一发,返回 { "success": true, "points": 10 }。
那一刻,我感觉自己像个真正的“产品开发者”了——不再只是切图仔,而是能端到端交付功能的人。
四、React + Node.js:前后端联调的“甜蜜暴击”
前端用 React 写个按钮:
const handleCheckIn = async () => {
const res = await fetch('/api/checkin', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userId: 'user123' })
});
const data = await res.json();
if (data.success) {
alert(`签到成功!当前积分:${data.points}`);
}
};
但问题来了:跨域!
浏览器报错:CORS policy: No 'Access-Control-Allow-Origin'。
我差点砸键盘。后来才知道,要在 Express 里加中间件:
const cors = require('cors');
app.use(cors());
装完 cors 包,重启,搞定。
这就是全栈的魅力:从前端 UI 到后端逻辑,再到数据存储,你能掌控整个链条。 虽然累,但爽。
五、回到现实:我该回老家吗?
上周五晚上,我和老婆视频。她算了一笔账:
- 上海:月薪18k,房租3500,吃饭3000,通勤800,存不下钱。
- 老家(三线城市):如果有远程工作,生活成本不到5000,还能付首付。
但风险是:小城市机会少,技术氛围弱,怕自己“废掉”。
我翻了翻 GitHub,发现自己这半年写了 47 个 commit,搭了 3 个完整项目,还学会了用 Docker 部署。虽然只是入门,但我确实在成长。
Node.js 让我明白:技术不是魔法,而是一步步调试、试错、解决的过程。就像我从卖瓷砖到写代码,没人天生就会,都是“跑起来再说”。
六、给想学 Node.js 的新人几点建议
- 别怕报错:每个红字都是你变强的勋章。我收藏了 20+ 个 Stack Overflow 页面。
- 先跑通,再优化:不要一上来就搞微服务、JWT、Redis。先让数据存进去、读出来。
- 结合产品思维:你写的不是代码,是功能。问问自己:这个接口解决了什么用户问题?
- 用 React + Node.js 组合练手:这是目前最友好的全栈入门路径,生态成熟,文档丰富。
- 别孤军奋战:加入 Discord 群、本地 Meetup,或者像我一样,找一个“技术搭子”互相鞭策。
最后:技术是工具,生活才是产品
写这篇文章时,我已经在考虑接一些远程兼职项目。如果能稳定月入2w+,或许真能回老家——买个带书房的房子,白天 coding,晚上陪爸妈散步。
Node.js 不会改变我的人生,但它给了我选择的权利。
以前,我只能在“继续卖瓷砖”和“硬扛上海”之间二选一。现在,我可以探索第三条路:用技术,打造属于自己的“产品人生”。
如果你也在转行路上焦虑、迷茫、半夜 debug 到崩溃——
别怕,你不是一个人。
我们都在用自己的方式,把 console.log('Hello World'),变成 console.log('Hello, my new life')。
技术分享,不止于代码;产品思维,始于生活。
—— 一个还在成长的30岁程序员,老张

评论 0