第一章:Node.js与Express初探

各位同学,欢迎来到《Express框架构建企业级API服务》的第一课。

说实话,每次带新人入门,我都会先问一个问题:「你为什么要学Node.js?」 答案五花八门,但核心无非两点——要么想用JavaScript写后端,要么听说它性能好、生态强。嗯,这两个理由都站得住脚。

今天这一章,咱们先把地基打牢。我会带你走一遍Node.js运行时、npm包管理器、Express框架,最后亲手创建第一个Express应用。别急,慢慢来。

1.1 Node.js运行时环境介绍

Node.js是什么?说白了,它就是一个让JavaScript跑在服务器上的环境。

你可能在浏览器里写过JS,但浏览器有DOM、有BOM,这些在服务器上根本用不着。Node.js给你换了一套API——文件系统、网络请求、进程管理……全是后端需要的东西。

核心特点:

  • 事件驱动:Node.js内部有个事件循环,你写的回调函数、Promise、async/await,最终都由它调度。我刚开始学的时候,总觉得事件循环很玄乎,后来发现其实就是「排队干活」——主线程不阻塞,异步任务先挂起,等时机到了再执行。
  • 非阻塞I/O:读文件、查数据库、发HTTP请求……这些操作不会卡住你的代码。举个例子,你同时发起10个数据库查询,Node.js不会等第一个查完再查第二个,而是几乎同时发出,谁先回来谁先处理。
  • 单线程:嗯,这里要注意。Node.js主线程是单线程的,但别担心——它通过事件循环和libuv的线程池来处理并发。说白了,单线程指的是你的JS代码在同一个线程里跑,但底层I/O操作是异步并行的。

避坑指南: 我曾经在项目中遇到一个CPU密集型的计算任务(比如图片处理),直接在主线程里跑,结果整个服务卡死了。后来用worker_threads才解决。记住:Node.js擅长I/O密集型,不擅长CPU密集型。

Node.js的版本选择:

版本 状态 建议
LTS(长期支持) 稳定 生产环境首选
Current(最新) 尝鲜 开发环境或学习使用

我个人习惯用LTS版本,稳。你想想看,生产环境出问题可不是闹着玩的。

1.2 npm包管理器

npm是Node.js自带的包管理器。说白了,它就是Node.js的「应用商店」——你想用别人写好的模块,一行命令就能装进来。

常用命令:

  • npm init:初始化项目,生成package.json
  • npm install <包名>:安装依赖
  • npm install -g <包名>:全局安装
  • npm uninstall <包名>:卸载依赖
  • npm run <脚本名>:运行package.json中的脚本

我记得刚入行时,有个同事把依赖装到了全局,结果项目部署时找不到包,排查了半天。后来我养成了一个习惯:项目依赖永远装本地,全局只装工具类包(比如nodemon、typescript)。

小技巧: 使用 npm init -y 可以快速生成默认的package.json,省去手动填写的麻烦。

package.json长什么样?

{
  "name": "my-express-app",
  "version": "1.0.0",
  "description": "我的第一个Express应用",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js"
  },
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "nodemon": "^3.0.0"
  }
}

看到那个 ^ 符号了吗?它表示允许安装小版本更新。比如 ^4.18.2 可以装4.18.x的最新版,但不会跳到4.19.0。为什么这样设计?因为大版本更新往往有破坏性变更,小版本则相对安全。

1.3 Express框架概述

Express是什么?它是Node.js最流行的Web框架,没有之一。

你想想看,用原生Node.js写一个HTTP服务器,要手动处理路由、解析请求体、设置响应头……代码又长又乱。Express把这些脏活累活都封装好了,你只需要关注业务逻辑。

Express的核心功能:

  • 路由:根据URL和方法分发请求
  • 中间件:请求处理管道,可以插入各种功能(日志、认证、解析等)
  • 模板引擎:支持EJS、Pug等,但企业级API通常返回JSON
  • 静态文件服务:一行代码搞定静态资源托管

我个人觉得,Express最大的魅力在于它的中间件机制。你想想看,一个请求进来,经过日志中间件→认证中间件→解析中间件→路由处理→响应返回,每个环节都可以独立开发和测试。这种「洋葱模型」的设计,后来被Koa、Fastify等框架借鉴。

避坑指南: 我曾经在项目中遇到中间件顺序搞反的问题——认证中间件写在了路由后面,结果未登录用户也能访问受保护接口。记住:中间件的执行顺序就是注册顺序,先注册的先执行

1.4 创建第一个Express应用

好了,理论说完了,咱们动手吧。

第一步:初始化项目

mkdir my-express-app
cd my-express-app
npm init -y

第二步:安装Express

npm install express

第三步:创建index.js

// 引入Express
const express = require('express');

// 创建应用实例
const app = express();

// 定义端口
const PORT = 3000;

// 定义一个路由
app.get('/', (req, res) => {
  res.send('Hello, Express!');
});

// 启动服务器
app.listen(PORT, () => {
  console.log(`服务器已启动,访问地址:http://localhost:${PORT}`);
});

第四步:运行

node index.js

打开浏览器,访问 http://localhost:3000,你会看到「Hello, Express!」。

嗯,就这么简单。但别小看这几行代码——它背后包含了HTTP服务器创建、路由匹配、响应发送等一系列操作。Express帮你把复杂的东西藏起来了。

小技巧: 开发时建议用 nodemon 替代 node,它会监听文件变化自动重启服务器。安装命令:npm install -g nodemon,然后运行 nodemon index.js

扩展一下:返回JSON

企业级API通常返回JSON格式的数据。Express提供了 res.json() 方法:

app.get('/api/users', (req, res) => {
  const users = [
    { id: 1, name: '张三' },
    { id: 2, name: '李四' }
  ];
  res.json(users);
});

你想想看,如果用原生Node.js,你得手动设置 Content-Type: application/json,再用 JSON.stringify() 序列化。Express一行搞定。

注意事项: 生产环境中,记得设置 NODE_ENV=production。Express在开发模式下会输出详细错误信息,这在生产环境是安全隐患。我见过有人把数据库连接信息通过错误堆栈泄露出去的……嗯,你懂的。

本章小结

今天我们做了三件事:

  • 理解了Node.js的事件驱动和非阻塞I/O
  • 学会了npm的基本用法和package.json的结构
  • 创建了第一个Express应用,并返回了JSON数据

下一章,我们会深入路由和中间件——这两个是Express的核心中的核心。到时候我会分享一些我在实际项目中踩过的坑,保证让你少走弯路。

好了,今天的课就到这里。动手试试吧,有问题随时交流。