Express.js 入门与核心配置指南

作者:岩茶时间:2026-10-28 12:55:03浏览:220

本文详细介绍如何使用 Node.js 和 Express 构建 Web 应用。涵盖从创建 package.json、安装依赖到编写基础路由的完整流程。深入解析错误处理中间件的定义与执行顺序,介绍 express-generator 项目生成器的用法,并讲解反向代理配置、Redis 在线用户统计及调试模块的使用技巧。

Express.js 项目初始化与基础配置

在机器上安装 Node.js 后,创建一个新目录作为项目根目录,即可开始开发第一个应用程序。


$ mkdir hello-world

在该目录下定义应用程序的“包”,其结构与标准 Node.js 包无异。目录中的 JSON 文件用于明确声明依赖项。建议使用 npm 命令获取 Express 的最新版本,避免安装 3.x 以外的版本,以规避潜在的不兼容问题。


{
 
"name": "hello-world",
 
"description": "hello world test app",
 
"version": "0.0.1",
 
"private": true,
 
"dependencies": {
  "express": "3.x"
}
}

当前,您已拥有包。json文件位于此目录,可通过npm(1)安装依赖,只需执行:


$ npm install

npm 安装完成后,node_modules 目录中将包含你依赖的 Express 3.x 版本。你可以使用 npm ls 命令验证安装结果,查看 Express 及其依赖树的完整结构,如下代码片段所示。


$ npm ls
hello-world@0.0.1 /private/tmp
└─┬ express@3.0.0beta7
 ├── commander@0.6.1
 ├─┬ connect@2.3.9
 │ ├── bytes@0.1.0
 │ ├── cookie@0.0.4
 │ ├── crc@0.2.0
 │ ├── formidable@1.0.11
 │ └── qs@0.4.2
 ├── cookie@0.0.3
 ├── debug@0.7.0
 ├── fresh@0.1.0
 ├── methods@0.0.1
 ├── mkdirp@0.3.3
 ├── range-parser@0.0.4
 ├─┬ response-send@0.0.1
 │ └── crc@0.2.0
 └─┬ send@0.0.3
  └── mime@1.2.6

创建应用实例与定义路由

接下来创建应用程序主体。新建一个名为 app.js 或 server.js 的文件(任选其一),引入 express 模块,并通过 express() 函数创建一个新的应用实例:


var express = require('express');
var app = express();

新创建的应用实例可以通过 app.VERB() 方法定义路由。例如,通过返回“Hello World”字符串来响应 GET / 请求。这里的 req 和 res 对象与原生 Node.js 提供的完全一致,因此你可以调用 res.pipe()、req.on('data', callback) 等与 Express 无关的原生方法。

Express 对这些对象进行了增强,提供了更高级的接口,如 res.send(),并自动为你添加内容长度头信息:


app.get('/hello.txt', function(req, res){
 res.send('Hello World');
});

最后,调用 app.listen() 方法绑定端口并开始监听。该方法接受的参数与 Node.js 的 net.Server#listen() 相同:


var server = app.listen(3000, function() {
  console.log('Listening on port %d', server.address().port);
});

使用 express-generator 生成项目骨架

使用 express(1) 命令行工具生成应用程序骨架。

Express 团队维护着一个便捷的项目生成器,名为 express-generator(1)。如果通过 npm 全局安装该生成器,即可从电脑任意位置调用它:


$ npm install -g express-generator

该工具提供了一种简单的方法来获取应用程序框架,但其功能范围有限,例如仅支持少数几个模板引擎。而 Express 本身实际上支持为 Node.js 构建任何网站框架模板。你可以通过 help 命令查看可用选项:


Usage: express [options]
Options:
 -h, --help     output usage information
 -V, --version    output the version number
 -e, --ejs      add ejs engine support (defaults to jade)
 -H, --hogan     add hogan.js engine support
 -c, --css  add stylesheet support (less|stylus|compass) (defaults to plain css)
 -f, --force     force on non-empty directory

如果你希望生成支持各种情况的应用程序,只需执行以下命令:


$ express --css stylus myapp
create : myapp
create : myapp/package.json
create : myapp/app.js
create : myapp/public
create : myapp/public/javascripts
create : myapp/public/images
create : myapp/public/stylesheets
create : myapp/public/stylesheets/style.styl
create : myapp/routes
create : myapp/routes/index.js
create : myapp/views
create : myapp/views/index.jade
create : myapp/views/layout.jade

install dependencies:
$ cd myapp && npm install

run the app:
$ DEBUG=myapp node app

与其他 Node.js 应用一样,你必须安装所需的依赖关系:

随后即可启动项目。


$ npm start

这就是让简单应用程序运行起来所需的全部步骤。请注意,Express 并不强制绑定特定的目录结构,上述结构仅作为参考指南。应用程序的具体结构选择可以参考 GitHub 库中的示例。

错误处理中间件的定义与执行

错误处理

错误处理中间件的定义方式与普通中间件类似,但必须定义四个参数,其函数签名为 (err, req, res, next):


app.use(function(err, req, res, next){
 console.error(err.stack);
 res.send(500, 'Something broke!');
});

虽然强制性的错误处理中间件通常不定义在最后,但在其他 app.use() 之后,其调用方式如下所示:


var bodyParser = require('body-parser');
var methodOverride = require('method-override');
app.use(bodyParser());
app.use(methodOverride());
app.use(app.router);
app.use(function(err, req, res, next){
 // logic
});

这些中间件的响应内容是完全任意的。你可以选择返回 HTML 错误页面、简短的消息、JSON 字符串或任何其他你喜欢的响应格式。

为了构建更有组织性和更高层次的框架,你可以定义多个错误处理中间件,就像定义普通中间件一样。例如,假设你想为 XHR 请求定义一个特定的错误处理器,除了常规处理外,你可以执行以下操作:


var bodyParser = require('body-parser');
var methodOverride = require('method-override'); 

app.use(bodyParser());
app.use(methodOverride());
app.use(app.router);
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);

在更通用的 logErrors 中,可以将请求和错误信息写入 stderr、Loggly 或其他类似的服务:


function logErrors(err, req, res, next) {
 console.error(err.stack);
 next(err);
}

clientErrorHandler 的定义如下所示,注意这里会显式地将错误传递给下一个中间件:


function clientErrorHandler(err, req, res, next) {
 if (req.xhr) {
  res.send(500, { error: 'Something blew up!' });
 } else {
  next(err);
 }
}

以下是一个“全方位”的 errorHandler 实现,可以定义为:


function errorHandler(err, req, res, next) {
 res.status(500);
 res.render('error', { error: err });
}

基于 Redis 统计在线用户

用户在线计数

本节详细讲解一个小型应用程序,使用 Redis 跟踪在线用户数量。首先创建 package.json 文件,包含两个附件:一个用于 Redis 客户端,另一个用于 Express 本身。同时确保已包装 Redis 并通过 $redis-server 运行服务。


{
 "name": "app",
 "version": "0.0.1",
 "dependencies": {
  "express": "3.x",
  "redis": "*"
 }
}

接下来,你需要创建一个应用程序,并建立与 Redis 的连接:


var express = require('express');
var redis = require('redis');
var db = redis.createClient();
var app = express();

接下来的中间件用于跟踪在线用户。在这里我们将使用排序集,这样通过 Redis 查询在线用户只需 N 毫秒。我们通过时间戳作为成员的“在线标准”。注意,这里我们使用 user-agent 字符串代替通常的用户 ID。


app.use(function(req, res, next){
 var ua = req.headers['user-agent'];
 db.zadd('online', Date.now(), ua, next);
});

下一个中间件在最后一刻使用 zrevrangebyscore 获取最大在线用户数量。我们总是获取最近在线的用户,其上限是当前时间戳减去 60000 毫秒。


app.use(function(req, res, next){
 var min = 60 * 1000;
 var ago = Date.now() - min;
 db.zrevrangebyscore('online', '+inf', ago, function(err, users){
  if (err) return next(err);
  req.online = users;
  next();
 });
});

最后,通过一个 URL 使用它,并绑定到一个端口!这就完成了。在新浏览器中访问这个应用程序,你会看到在线人数增加。


app.get('/', function(req, res){
 res.send(req.online.length + ' users online');
});

app.listen(3000);

反向代理配置与调试技巧

Express 的反向代理

在反向代理(如 Varnish 或 Nginx)背后使用 Express 非常简单,但需要进行配置。通过启用“信任代理”设置 app.enable(“trust proxy”),Express 具备了一些反向代理的技巧,此时 X-Forwarded-* 头字段可能是可信的,否则它们可能很容易被欺骗。

启用该设置有一些微妙影响。首先是 X-Forwarded-Proto 可能被反向代理设定,告知应用是 https 还是简单的 http。这个值由 req.protocol 反射出来。

第二个变化是 req.ip 和 req.ips 的值将填充 X-Forwarded-For 地址列表。

调试 Express

Express 内部使用调试模块记录路径匹配和应用程序模式的信息。要查看这些信息,只需简单设置调试环境变量为 express:*,当启动应用程序后,你将在控制台看到调试信息。


$ DEBUG=express:* node ./bin/www

运行这个 hello world 示例将打印以下内容:


express:application booting in development mode +0ms
express:router defined get /hello.txt +0ms
express:router defined get /hello.txt +1ms

另外,Express 可执行文件(生成器)生成的程序也使用调试模块,默认作用域是 my-application 调试命名空间。

你可以用以下命令启用这些调试语句:


$ DEBUG=my-application node ./bin/www

关于调试的更多信息,请参阅调试指南。

作者最新文章