精选 Express 框架 常用指令与核心速查备忘单,涵盖高频用法、配置参数与实用技巧。 精选 Express 常用指令与核心速查备忘单,涵盖高频用法、配置参数与实用技巧。Express 是 Node.js 的灵活精简 Web 框架
Express 是基于 Node.js 的快速、开放、极简 Web 开发框架,提供简洁灵活的路由、丰富的 HTTP 工具以及对多种模板引擎的支持,适合快速搭建 Web 与移动后端服务。
按下列步骤创建第一个 Express 应用。应用本质上是按顺序执行的中间件函数链,每个中间件可访问请求对象、响应对象以及下一中间件。
创建项目,添加 package.json 配置
$ mkdir myapp # 创建目录
$ cd myapp # 进入目录
$ npm init -y # 初始化配置
安装依赖
$ npm install express
入口文件 index.js 添加代码:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`Listening port on ${port}`);
});
使用以下命令运行应用程序
$ node index.js
Express 应用生成器可快速创建应用骨架,生成目录结构、安装依赖并配置基本视图与样式引擎,从而把时间集中在业务逻辑上。
使用方法: express [options] [dir]
选项:
-h, --help 输出使用信息
--version 输出版本号
-e, --ejs 添加 ejs 引擎支持
--hbs 添加 hbs 引擎支持
--pug 添加 pug 引擎支持
-H, --hogan 添加 hogan.js 引擎支持
--no-view 不生成视图引擎
-v, --view <engine> 添加视图 <engine> 支持 (ejs|hbs|hjs|jade|pug|twig|vash) (默认 jade)
-c, --css <engine> 添加样式表 <engine> 支持 (less|stylus|compass|sass) (默认 css)
--git 添加 .gitignore
-f, --强制执行 强制在非空目录中执行
创建 myapp 项目
$ express --view=pug myapp
# 运行应用程序
$ DEBUG=myapp:*npm start
应用程序对象表示整个 Express 应用,通常命名为 app,用于注册路由、中间件与各类设置项。
var express = require('express');
var app = express();
console.dir(app.locals.title);
//=> 'My App'
console.dir(app.locals.email);
//=> 'me@myapp.com'
属性 (Attribute)
| :- | :- |
|---|---|
app.locals |
应用级本地变量,视图模板可直接访问 # |
app.mountpath |
当前子应用挂载到父应用时的路径模式 # |
事件 (Events)
| :- | :- |
|---|---|
mount |
子应用挂到父应用时触发,监听器注册在子应用上 # |
方法 (Method)
| :- | :- |
|---|---|
app.all() |
为路径注册匹配全部 HTTP 方法的处理 # |
app.delete() |
注册并处理 HTTP DELETE 删除请求 # |
app.disable() |
将指定布尔型应用设置关闭为 false # |
app.disabled() |
判断指定设置当前是否处于禁用状态 # |
app.enable() |
将指定布尔型应用设置打开为 true # |
app.enabled() |
判断指定设置当前是否处于启用状态 # |
app.engine() |
为扩展名绑定自定义模板渲染引擎 # |
app.get(name) |
读取已配置的应用程序设置项取值 # |
app.get(path, callback) |
注册并处理 HTTP GET 读取请求 # |
app.listen() |
绑定端口并开始接受客户端连接 # |
app.METHOD() |
按任意 HTTP 方法名注册对应路由 # |
app.param() |
为路由参数添加回调 # |
app.path() |
返回应用在挂载点上的规范路径字符串 # |
app.post() |
注册并处理 HTTP POST 提交请求 # |
app.put() |
注册并处理 HTTP PUT 更新请求 # |
app.render() |
渲染指定视图模板并得到输出结果 # |
app.route() |
返回可用于链式定义的单路径路由 # |
app.set() |
写入或覆盖应用程序配置属性值 # |
app.use() |
在应用级挂载中间件或子路由器 # |
请求对象包含 HTTP 请求的全部信息,包括查询参数、请求体、请求头以及路由匹配结果等。
属性 (Attribute)
| :- | :- |
|---|---|
req.app |
指向当前 Express 应用程序实例引用 # |
req.baseUrl |
当前路由器被挂载时的基础 URL 前缀 # |
req.body |
保存已解析完成的请求体内容对象 # |
req.cookies |
保存客户端发送过来的 Cookie 键值 # |
req.fresh |
根据缓存协商判断请求内容是否仍新鲜 # |
req.hostname |
从 Host 请求头解析得到的主机名称 # |
req.ip |
发起请求的客户端远程 IP 地址 # |
req.ips |
经过代理时记录的各层 IP 地址列表 # |
req.method |
HTTP 请求方法 # |
req.originalUrl |
未经改写的完整原始请求 URL # |
req.params |
路径中命名参数解析后的键值对象 # |
req.path |
去掉查询串后的请求路径部分 # |
req.protocol |
当前请求使用的协议如 http 或 https # |
req.query |
URL 查询字符串解析后的参数对象 # |
req.route |
本次请求最终匹配到的路由对象 # |
req.secure |
判断当前连接是否通过 TLS 加密 # |
req.signedCookies |
通过密钥校验后的签名 Cookie 集合 # |
req.stale |
与 fresh 相反,表示缓存内容已过期 # |
req.subdomains |
从主机名拆分得到的子域名片段列表 # |
req.xhr |
根据请求头判断是否为 Ajax 异步请求 # |
方法 (Method)
| :- | :- |
|---|---|
req.accepts() |
按 Accept 头检查客户端可接受类型 # |
req.acceptsCharsets() |
按 Accept-Charset 检查可接受字符集 # |
req.acceptsEncodings() |
按 Accept-Encoding 检查可接受编码 # |
req.acceptsLanguages() |
按 Accept-Language 检查可接受语言 # |
req.get() |
读取指定名称的 HTTP 请求头字段值 # |
req.is() |
判断请求体 Content-Type 是否匹配 # |
req.param() |
读取参数值(已弃用,请改用专用属性) # |
req.range() |
解析 Range 头并返回可用范围结果 # |
响应对象封装向客户端发送 HTTP 响应所需的全部方法与属性,支持设置状态码、响应头以及多种内容类型。
app.get('/', function (req, res) {
console.dir(res.headersSent); //false
res.send('OK');
console.dir(res.headersSent); //true
});
属性 (Attribute)
| :- | :- |
|---|---|
res.app |
当前应用程序实例 # |
res.headersSent |
表示响应头是否已经发送给客户端 # |
res.locals |
仅对当前请求视图可见的本地变量 # |
方法 (Method)
| :- | :- |
|---|---|
res.append() |
向已有响应头追加额外字段值 # |
res.attachment() |
设置 Content-Disposition 附件响应头 # |
res.cookie() |
在响应中写入客户端 Cookie 数据 # |
res.clearCookie() |
通过响应清除指定名称的 Cookie # |
res.download() |
以附件方式提示浏览器下载文件 # |
res.end() |
结束本次响应且可不发送额外数据 # |
res.format() |
按客户端可接受类型协商并格式化输出 # |
res.get() |
读取将要发送的响应头字段当前值 # |
res.json() |
序列化并发送 JSON 格式的响应体 # |
res.jsonp() |
发送带 JSONP 回调支持的 JSON 响应 # |
res.links() |
填充 Link 响应头用于资源关联 # |
res.location() |
设置 Location 头指示资源新位置 # |
res.redirect() |
向客户端发出重定向到新地址的响应 # |
res.render() |
渲染模板引擎视图并写入响应 # |
res.send() |
按类型自动发送字符串、缓冲或对象 # |
res.sendFile() |
将文件以二进制流方式发送给客户端 # |
res.sendStatus() |
设置状态码并发送对应状态文本正文 # |
res.set() |
写入一个或多个 HTTP 响应头字段 # |
res.status() |
设置本次响应的 HTTP 状态码数值 # |
res.type() |
设置响应的 Content-Type 媒体类型 # |
res.vary() |
向 Vary 头追加用于缓存协商的字段 # |
以下示例覆盖路由、请求处理、响应方法与中间件等核心概念,帮助快速理解并应用 Express 构建 REST API 与动态页面。
路由器实例是完整的中间件与路由系统。可把它当作「迷你应用」挂到 app.use() 或其他路由器上,使路由组织更清晰、更易维护。
对传递给此路由器的任何请求调用
router.use(function (req, res, next) {
//.. 这里可以放一些逻辑,像其他中间件一样
next();
});
将处理以 /events 结尾的任何请求
// 取决于路由器 "use()" 的位置
router.get('/events', (req, res, next) => {
//..
});
res 对象表示 Express 应用程序在收到 HTTP 请求时发送的 HTTP 响应。它提供设置状态、发送内容与链式调用能力,通常在路由处理函数中命名为 res。
app.get('/user/:id', (req, res) => {
res.send('user' + req.params.id);
});
req 对象表示 HTTP 请求,具有请求查询字符串、参数、正文、HTTP
标头等属性。理解其属性与方法是构建动态 Web 应用的关键基础。
app.get('/user/:id', (req, res) => {
res.send('user' + req.params.id);
});
用于快速结束响应而不发送数据,或结束已通过其他方法写出的响应。
res.end();
res.status(404).end();
结束响应过程。此方法实际来自 Node 核心,特别是 response.end() 方法,属于
http.ServerResponse
发送 JSON 格式响应;会自动序列化对象并设置正确的 Content-Type。
res.json(null);
res.json({ user: 'tobi' });
res.status(500).json({ error: 'message' });
为路径上的所有 HTTP 方法加载中间件;无论 GET、POST、PUT 等都会执行该回调。
app.all('/secret', function (req, res, next) {
console.log('access secret section...');
next(); // 将控制权传递给下一个处理程序
});
处理 HTTP DELETE 请求,通常用于删除服务器上的资源。
app.delete('/', function (req, res) {
res.send('DELETE request to homepage');
});
将名为 name 的布尔设置设为 false;等价于 app.set('foo', false)。
app.disable('trust proxy');
app.get('trust proxy');
// => false
检查设置 name 是否为禁用(false);属性为 false 时返回 true。
app.disabled('trust proxy');
// => true
app.enable('trust proxy');
app.disabled('trust proxy');
// => false
为指定文件扩展名注册模板引擎。默认会按扩展名 require() 对应引擎。
var engines = require('consolidate');
app.engine('haml', engines.haml);
app.engine('html', engines.hogan);
绑定并监听指定主机与端口;与 Node 的 http.Server.listen() 相同。端口省略或为 0 时由系统分配空闲端口。
var express = require('express');
var app = express();
app.listen(3000);
路由定义应用如何响应特定 URI 与 HTTP 方法;结构为 app.METHOD(PATH, HANDLER)。
const express = require('express');
const app = express();
// 向主页发出 GET 请求时响应 "hello world"
app.get('/', (req, res) => {
res.send('hello world');
});
// GET 方法路由
app.get('/', (req, res) => {
res.send('GET request to the homepage');
});
// POST 方法路由
app.post('/', (req, res) => {
res.send('POST request to the homepage');
});
中间件可访问请求、响应与下一中间件;可执行逻辑、修改对象、结束周期或继续传递控制权。
function logOriginalUrl(req, res, next) {
console.log('ReqURL:', req.originalUrl);
next();
}
function logMethod(req, res, next) {
console.log('Request Type:', req.method);
next();
}
const log = [logOriginalUrl, logMethod];
app.get('/user/:id', log, (req, res, next) => {
res.send('User Info');
});
Express 可用 Pug、EJS、Handlebars 等模板引擎动态生成 HTML;需先设置视图引擎,再在 views 中放置模板。
app.set('view engine', 'pug');
在 views 目录中创建名为 index.pug 的 Pug 模板文件,内容如下
html
the head
title= title
the body
h1=message
创建路由以渲染 index.pug 文件。如果未设置视图引擎属性,则必须指定视图文件的
扩展名
app.get('/', (req, res) => {
res.render('index', {
title: 'Hey',
message: 'Hello there!'
});
});