环境搭建与第一个应用:Node.js 环境准备、安装 Connect、创建第一个 Connect 应用、理解中间件栈
好,咱们正式开始动手。这一章我会带你从零搭好环境,然后跑起第一个 Connect 应用。别小看这一步——我见过太多人卡在环境上,代码写好了跑不起来,那才叫憋屈。
Node.js 环境准备
Connect 是跑在 Node.js 上的,所以第一步,你得有 Node.js。我个人习惯用 LTS 版本,稳定,坑少。
- 下载地址:官网 nodejs.org,下载 LTS 版本就行
- 验证安装:打开终端,敲
node -v和npm -v,能看到版本号就说明成了 - 版本建议:Node.js 14.x 及以上,太老的版本有些 API 不支持
嗯,这里要注意:Windows 用户装完 Node 后,记得重启一下终端。我遇到过有人装好了,但终端没刷新,一直报“node 不是内部命令”。
安装 Connect
环境准备好了,接下来装 Connect。说白了就是一个 npm 包,安装命令很简单:
mkdir my-connect-app
cd my-connect-app
npm init -y
npm install connect
这几步做完,你的项目里就有了 node_modules 文件夹和 package.json。Connect 就被装在里面了。
创建第一个 Connect 应用
现在我们来写真正的代码。在项目根目录新建一个 app.js 文件,内容如下:
const connect = require('connect');
const app = connect();
app.use((req, res, next) => {
res.end('Hello, Connect!');
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
然后运行:
node app.js
打开浏览器访问 http://localhost:3000,你会看到页面上显示 Hello, Connect!。成了!
这段代码干了什么呢?我拆开给你看:
require('connect'):引入 Connect 模块connect():创建一个应用实例app.use():注册一个中间件函数app.listen(3000):启动服务器,监听 3000 端口
中间件函数接收三个参数:req(请求对象)、res(响应对象)、next(下一个中间件的回调)。这里我们直接返回了响应,没有调用 next(),所以请求到这里就结束了。
理解中间件栈
中间件栈,是 Connect 最核心的概念。说白了,就是一组函数按顺序排成一列,请求来了,挨个过一遍。
我画了一张图,帮你理解这个流程:
你看,请求从左到右穿过每个中间件,最后到达处理函数,然后响应原路返回。每个中间件都可以做三件事:
- 处理请求:修改
req或res对象 - 决定是否继续:调用
next()就往下传,不调用就停在这 - 捕获错误:如果出错了,可以跳过后续中间件,直接返回错误响应
举个例子,我们写三个中间件看看效果:
const connect = require('connect');
const app = connect();
// 中间件1:记录请求时间
app.use((req, res, next) => {
console.log('请求时间:', Date.now());
next();
});
// 中间件2:添加自定义头
app.use((req, res, next) => {
res.setHeader('X-Custom-Header', 'Hello');
next();
});
// 中间件3:返回响应
app.use((req, res, next) => {
res.end('中间件栈演示');
});
app.listen(3000);
运行后,每次请求都会先打印时间,再添加响应头,最后返回内容。顺序一点不乱。
我曾经在项目中遇到过一个坑:有个中间件忘记调用 next(),结果后面的所有中间件都不执行了,接口一直挂在那不返回。排查了半天才发现是少写了一行。所以,写中间件时一定要想清楚——这个中间件是要拦截请求,还是放行?
中间件注册顺序
顺序很重要。我列个表给你看:
| 场景 | 推荐顺序 | 原因 |
|---|---|---|
| 日志记录 | 最前面 | 尽早记录,不遗漏任何请求 |
| 请求解析(body、cookie) | 日志之后 | 解析完后续中间件才能用 |
| 路由处理 | 最后 | 前面的准备工作都做完,再处理具体业务 |
| 错误处理 | 最后注册,但参数有4个 | 捕获前面所有中间件的错误 |
(err, req, res, next),少一个都不行。我曾经写成了3个参数,结果错误永远抓不到,请求直接崩溃。Connect 是根据参数个数来区分普通中间件和错误中间件的。
好了,这一章的内容就这些。环境搭好了,第一个应用跑起来了,中间件栈也理解了。接下来你就可以开始玩更复杂的场景了——比如加个路由、处理表单数据、做身份验证。这些我们后面会慢慢展开。