第一章: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.jsonnpm 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的核心中的核心。到时候我会分享一些我在实际项目中踩过的坑,保证让你少走弯路。
好了,今天的课就到这里。动手试试吧,有问题随时交流。