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

小而美开发者
2025-12-12 16:18
阅读 4193

去年双11前夜,我正窝在成都家里啃着兔头刷 GitHub trending,突然收到组长的消息:“后端人手不够,你先顶上写个接口吧。”我?前端仔?当时内心OS:我连 npm 和 yarn 都还没分清楚呢!但 deadline 不等人,第二天就要联调,我只能硬着头皮打开终端,敲下 node --version —— 结果提示 command not found。那一刻,我真的想砸电脑。

不过现在回头看,那次“赶鸭子上架”反而让我彻底入了 Node.js 的坑。作为一个常年混迹开源社区、喜欢扒拉底层源码的成都程序员(生活节奏慢,但代码节奏不能慢),我发现 Node.js 其实没那么可怕——只要你别一上来就去看 V8 引擎源码(别问我怎么知道的)。

今天这篇教程,就是给和当初的我一样懵的新手准备的。不画大饼,不堆术语,直接上手跑起来再说。


为什么是 Node.js?而不是 PHP/Java/Python?

说实话,一开始我也怀疑:用 JavaScript 写后端?这不是前端“越界”了吗?但现实很骨感——我们团队前后端分离,API 接口变动频繁,产品经理天天改需求(手动狗头)。如果后端用 Java,光是启动 Spring Boot 就要等一分钟,而 Node.js 改一行代码,刷新一下 Postman 立马见效。

更重要的是:全栈同语言,心智负担小。你在前端用 async/await,后端也能用;你在前端处理 JSON,后端也是一样。不用在两种思维模式之间来回切换,对打工人极其友好。

而且,Node.js 生态真的强。随便去 GitHub 搜一个关键词,比如 express middleware,能出来几万个 star 的项目。我经常半夜翻这些开源项目的源码,看人家怎么处理错误、怎么组织模块,比看文档有用多了。


起手式:环境搭建 + Hello World

别急着写复杂逻辑,先让代码跑起来。这才是程序员的第一生产力。

第一步:装 Node.js

去 https://nodejs.org 下载 LTS 版(别贪新,稳定最重要)。装完后验证:

node -v  # 应该输出 v18.x 或 v20.x
npm -v   # npm 是包管理器,自带的

💡 小技巧:如果你像我一样喜欢折腾,可以用 nvm(Node Version Manager)管理多个版本。成都的夏天热,但我的终端里可以同时跑 v16、v18、v20,互不干扰。

第二步:初始化项目

找个干净目录,比如 my-node-server:

mkdir my-node-server
cd my-node-server
npm init -y  # -y 表示一路回车用默认配置

这会在目录下生成一个 package.json,相当于项目的身份证。

第三步:写个最简服务器

新建 index.js:

const http = require('http');

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

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

运行:

node index.js

然后浏览器打开 http://localhost:3000,看到那行字没?恭喜你,正式踏入服务端世界!

⚠️ 踩坑预警:如果你看到 Error: listen EADDRINUSE,说明 3000 端口被占用了。可能是上次没关进程,或者你自己开了别的服务。用 lsof -i :3000(Mac/Linux)查一下,干掉它就行。


升级装备:用 Express 框架

原生 http 模块虽然轻量,但写路由、中间件太麻烦。这时候就得请出 Express —— Node.js 界的 jQuery(虽老但稳)。

安装:

npm install express

重写 index.js:

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

// 中间件:解析 JSON 请求体
app.use(express.json());

// 路由
app.get('/', (req, res) => {
  res.send('Hello from Express in Chengdu!');
});

app.post('/api/user', (req, res) => {
  // 假设前端发了个 { name: "张三" }
  const { name } = req.body;
  res.json({ message: `欢迎 ${name}!`, timestamp: Date.now() });
});

// 启动
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`🚀 Server ready on port ${PORT}`);
});

现在你可以用 Postman 或 curl 测试 POST 请求:

curl -X POST http://localhost:3000/api/user \
  -H "Content-Type: application/json" \
  -d '{"name":"李四"}'

是不是比原生写法清爽多了?


项目结构 & 开发体验优化

真实项目不可能所有代码塞在一个文件里。我一般这样组织:

my-node-server/
├── package.json
├── index.js          # 入口文件
├── routes/
│   └── user.js       # 用户相关路由
├── controllers/
│   └── userController.js
└── utils/
    └── logger.js

另外,每次改代码都要手动重启 node index.js?太原始了!装个 nodemon,自动监听文件变化重启:

npm install -D nodemon

然后在 package.json 里加个脚本:

{
  "scripts": {
    "dev": "nodemon index.js"
  }
}

以后启动开发服务器只需:

npm run dev

改完代码保存,终端自动重启,爽到飞起。上周五晚上加班改一个支付回调逻辑,靠这个省了至少 20 次手动重启,不然真得猝死在工位上。


调试 & 错误处理:别让线上炸了

Node.js 最怕什么?未捕获的异常直接 crash 整个进程。曾经有一次,因为没处理数据库连接超时,导致整个服务挂了,用户下单失败,测试小姐姐追着我问“你怎么又把线上搞崩了?”(其实是我,但锅甩给了运维 😅)

所以,务必加上全局错误监听:

process.on('uncaughtException', (err) => {
  console.error('💥 Uncaught Exception:', err);
  // 记录日志、告警,然后优雅退出
  process.exit(1);
});

process.on('unhandledRejection', (reason, promise) => {
  console.error('💣 Unhandled Rejection at:', promise, 'reason:', reason);
  process.exit(1);
});

另外,永远不要把敏感信息(比如数据库密码)写死在代码里。用 .env 文件 + dotenv 包:

npm install dotenv

.env 文件(别提交到 GitHub!):

DB_HOST=localhost
DB_USER=admin
DB_PASS=secret123

在代码开头加载:

require('dotenv').config();
console.log(process.env.DB_PASS); // 输出 secret123

记得把 .env 加到 .gitignore 里,不然哪天不小心 push 上去,GitHub 安全警报分分钟找上门。


发布到 GitHub:让你的项目被看见

写完代码,当然要分享出去。我几乎所有练习项目都扔 GitHub 上,一是备份,二是方便别人(和未来的自己)参考。

初始化 git 仓库:

git init
echo "node_modules/" >> .gitignore
echo ".env" >> .gitignore
git add .
git commit -m "feat: initial node.js server with Express"
git remote add origin https://github.com/yourname/my-node-server.git
git push -u origin main

如果你的项目有点意思,还可以加个 README.md,写清楚怎么跑起来。很多新手项目没人 star,就是因为 README 写得太敷衍。


性能 & 兼容性?别慌,慢慢来

作为前端出身,我一开始特别担心:Node.js 处理高并发行不行?会不会内存泄漏?

其实对于大多数中小型项目,Express + 合理的错误处理 + PM2 进程管理,已经足够扛住日常流量。我们双11那个临时接口,峰值 QPS 500+,Node.js 稳如老狗。

至于浏览器兼容性?别笑,Node.js 虽然跑在服务端,但如果你用了一些现代 JS 语法(比如 optional chaining ?.),而服务器 Node 版本太低,照样会报错。所以:

  • 本地开发用高版本(v18+)
  • 生产环境确认部署环境版本
  • 或者用 Babel 编译(但一般没必要)

最后说两句

从那个连 Node 都没装过的菜鸟,到现在能独立搭服务、看 V8 源码注释(虽然只看懂 10%),我最大的体会是:动手比纠结重要。

Node.js 的门槛其实很低,但天花板很高。你可以用它写个 API,也可以用它构建微服务、实时聊天、甚至操作系统(好吧,夸张了)。

如果你也在成都,生活节奏舒服,不妨趁周末泡杯茶,敲几行代码。说不定下一个 GitHub Trending 项目,就出自你手。

项目地址我放 GitHub 了:github.com/yourname/my-node-server(替换为你的真实链接)
欢迎 star、fork、提 issue —— 别提 PR,我怕我 merge 不了(狗头保命)。

搞定收工,今晚火锅走起!

评论 0

最热最新
暂无评论
小而美开发者Lv.1
0
影响力
0
文章
0
粉丝