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

写码的老王
2025-12-17 03:02
阅读 1285

上周五晚上十点半,我坐在成都家里阳台上,一边嗦着冒菜一边改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.jsserver.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"

上线部署我推荐两种方案:

  1. Vercel/Render:免费、自动HTTPS、Git集成,适合小项目
  2. 云服务器(阿里云/腾讯云):自己用PM2守护进程

以Render为例(我最近在技术分享会上安利给很多新人):

  • 把代码推到GitHub
  • 在Render新建Web Service,连上你的repo
  • 设置Build Command: npm install,Start Command: node server.js
  • 等2分钟,自动分配域名!比自己配Nginx省心100倍

给求职者的特别建议

如果你学Node.js是为了求职,记住这几点:

  1. GitHub要有完整项目:别只放代码片段。我的建议是:

    • 一个Express+SQLite的REST API
    • 配套的前端(React/Vue都行)
    • README写清楚如何安装、运行、API文档
    • 加上.gitignorepackage-lock.json等细节——面试官会看!
  2. 理解异步编程:Node.js的核心是事件循环。能讲清楚Promiseasync/await回调地狱的区别,面试就赢了一半。

  3. 关注安全:别在代码里写死数据库密码!用环境变量(.env文件 + dotenv库),这点很多新手栽跟头。

  4. 性能意识:Node.js单线程,别在请求里干CPU密集型活(比如图片处理)。用worker_threads或拆成微服务。


最后几句真心话

写这篇文章的时候,窗外成都的雨下得挺大。想起2015年我第一次在公司技术分享会上讲Node.js,台下坐着几个后端大佬,紧张得手抖。现在嘛,虽然头发少了点,但至少敢说“这需求我Node.js能搞定”。

Node.js不是银弹,但它给了前端更多可能性。不用求人、快速验证想法、全栈掌控——这种自由感,值得你花几天时间入门。

对了,文中的代码我都整理到GitHub了(搜索chengdu-old-coder/nodejs-starter),star不重要,fork了能跑起来就行。如果遇到问题,欢迎提issue——毕竟咱们程序员,不就是互相救火长大的么?

彩蛋:上次团建,产品经理喝多了说:“你们前端现在都能写后端了,是不是要取代我们产品?”
我笑着回他:“放心,我们连需求文档都看不懂,咋取代你?”
—— 真相了 😂

评论 0

最热最新
暂无评论
写码的老王Lv.1
0
影响力
0
文章
0
粉丝