环境搭建与第一个应用: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 不支持
小提示:如果你同时维护多个项目,推荐用 nvm(Node Version Manager)管理 Node 版本。切换起来很方便,我平时就用它。

嗯,这里要注意: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。每个项目单独安装,避免版本冲突。我曾经图省事全局装过一次,结果两个项目依赖不同版本,折腾了半天。

创建第一个 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 最核心的概念。说白了,就是一组函数按顺序排成一列,请求来了,挨个过一遍。

我画了一张图,帮你理解这个流程:

Connect 中间件栈执行流程 请求进入 中间件 1 日志记录 中间件 2 请求解析 中间件 3 路由处理 响应返回 关键点: • 中间件按注册顺序依次执行 • 每个中间件可以决定是否调用 next() 传递到下一个 • 如果不调用 next(),请求就在当前中间件终止并返回响应

你看,请求从左到右穿过每个中间件,最后到达处理函数,然后响应原路返回。每个中间件都可以做三件事:

  1. 处理请求:修改 req 或 res 对象
  2. 决定是否继续:调用 next() 就往下传,不调用就停在这
  3. 捕获错误:如果出错了,可以跳过后续中间件,直接返回错误响应

举个例子,我们写三个中间件看看效果:

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个 捕获前面所有中间件的错误
避坑指南:错误处理中间件有4个参数 (err, req, res, next),少一个都不行。我曾经写成了3个参数,结果错误永远抓不到,请求直接崩溃。Connect 是根据参数个数来区分普通中间件和错误中间件的。

好了,这一章的内容就这些。环境搭好了,第一个应用跑起来了,中间件栈也理解了。接下来你就可以开始玩更复杂的场景了——比如加个路由、处理表单数据、做身份验证。这些我们后面会慢慢展开。