Express.js 入门与核心配置指南
本文详细介绍如何使用 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
关于调试的更多信息,请参阅调试指南。
怎么在本地运行JavaScript脚本:Node.js下载安装与环境配置教程
2026-11-05 09:02:33
JavaScript开发环境怎么搭建:Node.js安装与VS Code配置指南
2026-11-03 23:36:59
JavaScript零基础入门:环境搭建与第一个Hello World
2026-11-03 23:34:09
NW.js 是什么:基于 Chromium 和 Node.js 的桌面应用框架
2026-11-03 15:14:00
nvm、n 和官方安装包:哪种 Node.js 升级方式更适合你
2026-11-03 14:54:28
