Node.js新手教程:从零开始学习服务器端JavaScript
上周五晚上十点半,我坐在成都家里阳台上,一边嗦着冒菜一边改bug。老婆在旁边追剧,猫在键盘上踩来踩去——典型的35岁老码农周末日常。突然收到前同事小李的消息:“哥,我在准备转全栈,想学Node.js,有啥建议没?”
说实话,看到这消息我有点感慨。十年前我也是个只会写前端的“切图仔”,后来被逼着搞服务端,硬着头皮啃Node.js文档,踩了无数坑才混到今天。现在成都这边不少初创公司和中厂都在招会Node.js的全栈,尤其是那些想用JS一统前后端的技术团队。小李这波操作,明显是冲着求职去的。
所以,今天这篇不是什么高大上的架构论文,就是我这个还在一线写代码的老油条,手把手带你从零搭一个能跑起来的Node.js服务。咱们不整虚的,直接上案例,就像当年我在技术分享会上给新人讲的那样。
为什么前端要碰Node.js?
先说句掏心窝子的话:如果你只满足于做界面、调API,那Node.js对你可能没啥用。但如果你想:
- 自己搞个全栈项目塞进GitHub当作品集
- 在团队里多扛点活(或者少求后端大哥)
- 跳槽时简历上多一行“熟悉服务端开发”
- 或者单纯不想被产品经理指着鼻子说“这功能后端不支持,你前端能搞定吗?”
那Node.js就是你的必修课。
去年双11前,我们团队临时要搞个促销活动页,后端排期排到明年。我一咬牙,用Express搭了个轻量级服务,自己处理用户抽奖逻辑+数据落库。上线那天虽然凌晨三点还在改并发bug,但第二天老板请我喝了杯瑞幸——值了!
搭建你的第一个Node.js服务(别怕,真不难)
环境准备:别在Windows上折腾了
我知道有些兄弟还在用Win10写代码(致敬!),但听哥一句劝:装个WSL2或者直接切Mac/Linux。Node.js在类Unix系统上跑得更顺,npm依赖也少踩坑。
# 先确认你装了Node.js(建议LTS版,别追最新版,容易翻车)
node -v # 我现在用的是 v18.17.0
npm -v # 9.x以上就行
如果还没装,去nodejs.org下LTS版本,别信网上那些nvm教程——新手容易把自己绕晕。
初始化项目:npm init 别乱回车
mkdir my-first-node-app
cd my-first-node-app
npm init -y # -y 是快速初始化,但建议第一次手动填,理解每个字段含义
这时候你会得到一个package.json,它就像你项目的身份证。重点看这几个字段:
| 字段 | 建议值 | 说明 |
|---|---|---|
name |
小写+中划线,如promo-service |
别用中文和空格! |
version |
从0.1.0开始 |
遵循语义化版本 |
main |
index.js 或 server.js |
入口文件 |
scripts |
添加"start": "node server.js" |
方便启动 |
写个Hello World:但要比前端console.log高级点
新建server.js:
// server.js
const http = require('http');
const server = http.createServer((req, res) => {
// 设置响应头,避免中文乱码
res.setHeader('Content-Type', 'text/html; charset=utf-8');
// 最简单的路由判断
if (req.url === '/') {
res.end('<h1>成都老码农欢迎你!</h1><p>当前时间: ' + new Date().toLocaleString() + '</p>');
} else if (req.url === '/api/hello') {
// 返回JSON,前端最爱
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ message: 'Hello from Node.js!', timestamp: Date.now() }));
} else {
res.statusCode = 404;
res.end('<h1>404 - 这里啥也没有,去吃火锅吧</h1>');
}
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
console.log(`🚀 服务跑起来了!访问 http://localhost:${PORT}`);
});
运行它:
node server.js
打开浏览器:
http://localhost:3000→ 看到欢迎页面http://localhost:3000/api/hello→ 返回JSON数据
关键点:这里用了原生http模块,没装任何框架。为啥?因为很多新手一上来就用Express/Koa,结果连HTTP请求/响应的基本概念都不清楚。等你理解了这个,再用框架才会知其所以然。
升级到Express:别重复造轮子
原生写法适合教学,但真实项目谁这么干?早被产品经理骂死了。我们换成Express——Node.js界的老牌MVC框架,稳定、生态好、文档全。
npm install express
重写server.js:
// server.js (Express版)
const express = require('express');
const app = express();
// 中间件:自动解析JSON请求体(前端POST数据必备)
app.use(express.json());
// 静态资源托管(比如你的前端build目录)
app.use(express.static('public'));
// 路由
app.get('/', (req, res) => {
res.send('<h1>Express版成都老码农服务</h1>');
});
app.get('/api/hello', (req, res) => {
res.json({
message: 'Hello from Express!',
env: process.env.NODE_ENV || 'development',
timestamp: new Date().toISOString()
});
});
// 错误处理中间件(放最后!)
app.use((err, req, res, next) => {
console.error('线上事故预警!', err.stack);
res.status(500).json({ error: '服务器打瞌睡了,稍后再试' });
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`✅ Express服务启动成功!端口: ${PORT}`);
});
这时候你的项目结构应该是:
my-first-node-app/
├── node_modules/
├── public/ # 放静态文件(可选)
├── server.js
└── package.json
前端注意:app.use(express.static('public')) 这行能让前端直接访问public目录下的HTML/CSS/JS。比如你把Vue打包后的dist文件扔进去,就能直接通过http://localhost:3000/index.html访问——不用再开两个服务,爽歪歪!
连接数据库:别让数据飘在天上
光返回静态数据没意思,我们连个数据库。新手推荐SQLite(文件型,不用装服务)或MongoDB(文档型,JS友好)。这里用SQLite演示,轻量无负担。
npm install sqlite3
创建db.js初始化数据库:
// db.js
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('./data.db');
// 创建用户表(如果不存在)
db.serialize(() => {
db.run(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)`);
});
module.exports = db;
在server.js里加个POST接口:
const db = require('./db');
// 创建用户
app.post('/api/users', (req, res) => {
const { name, email } = req.body;
// 简单校验(真实项目要用Joi/yup)
if (!name || !email) {
return res.status(400).json({ error: '名字和邮箱不能为空' });
}
const stmt = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)');
stmt.run([name, email], function(err) {
if (err) {
// SQLite的UNIQUE约束冲突会报错
if (err.message.includes('UNIQUE constraint failed')) {
return res.status(409).json({ error: '邮箱已存在' });
}
return res.status(500).json({ error: '保存失败' });
}
res.status(201).json({
id: this.lastID,
name,
email,
message: '用户创建成功!'
});
});
stmt.finalize();
});
用Postman或curl测试:
curl -X POST http://localhost:3000/api/users \
-H "Content-Type: application/json" \
-d '{"name":"张三","email":"zhangsan@example.com"}'
血泪教训:记得stmt.finalize()释放资源!我去年就因为漏了这行,在压力测试时把数据库连接池搞爆了,半夜被运维电话叫醒——再也不敢偷懒了。
部署上线:别只在localhost玩
代码跑通只是开始,关键是要让用户能访问。本地开发用nodemon热更新:
npm install -D nodemon
# package.json scripts加一行
"dev": "nodemon server.js"
上线部署我推荐两种方案:
- Vercel/Render:免费、自动HTTPS、Git集成,适合小项目
- 云服务器(阿里云/腾讯云):自己用PM2守护进程
以Render为例(我最近在技术分享会上安利给很多新人):
- 把代码推到GitHub
- 在Render新建Web Service,连上你的repo
- 设置Build Command:
npm install,Start Command:node server.js - 等2分钟,自动分配域名!比自己配Nginx省心100倍
给求职者的特别建议
如果你学Node.js是为了求职,记住这几点:
GitHub要有完整项目:别只放代码片段。我的建议是:
- 一个Express+SQLite的REST API
- 配套的前端(React/Vue都行)
- README写清楚如何安装、运行、API文档
- 加上
.gitignore、package-lock.json等细节——面试官会看!
理解异步编程:Node.js的核心是事件循环。能讲清楚
Promise、async/await、回调地狱的区别,面试就赢了一半。关注安全:别在代码里写死数据库密码!用环境变量(
.env文件 + dotenv库),这点很多新手栽跟头。性能意识:Node.js单线程,别在请求里干CPU密集型活(比如图片处理)。用worker_threads或拆成微服务。
最后几句真心话
写这篇文章的时候,窗外成都的雨下得挺大。想起2015年我第一次在公司技术分享会上讲Node.js,台下坐着几个后端大佬,紧张得手抖。现在嘛,虽然头发少了点,但至少敢说“这需求我Node.js能搞定”。
Node.js不是银弹,但它给了前端更多可能性。不用求人、快速验证想法、全栈掌控——这种自由感,值得你花几天时间入门。
对了,文中的代码我都整理到GitHub了(搜索chengdu-old-coder/nodejs-starter),star不重要,fork了能跑起来就行。如果遇到问题,欢迎提issue——毕竟咱们程序员,不就是互相救火长大的么?
彩蛋:上次团建,产品经理喝多了说:“你们前端现在都能写后端了,是不是要取代我们产品?”
我笑着回他:“放心,我们连需求文档都看不懂,咋取代你?”
—— 真相了 😂

评论 0