一、简介
Express 是一个流行的 Node.js Web 应用程序框架,它简化了构建 Web 应用程序和 API 的过程。它提供了一组简单而灵活的功能,使开发者能够快速构建可靠的 Web 服务器。
以下是 Express 框架的一些主要特点:
- 路由:Express 提供了一种简单的方式来定义和处理不同 URL 路径的请求。通过定义路由,你可以将请求映射到特定的处理程序函数,以执行相应的操作。
- 中间件:Express 的中间件是一个非常强大的概念,它允许你在请求和响应之间执行功能。中间件可以用于处理身份验证、日志记录、错误处理等任务。Express 提供了一些内置的中间件,同时也允许你创建自定义的中间件。
- 模板引擎:Express 支持多种模板引擎,如 EJS、Pug(以前称为 Jade)、Handlebars 等。这些模板引擎使你能够轻松地生成动态的 HTML 页面。
- 错误处理:Express 提供了一种简单的方式来处理错误。你可以定义一个错误处理中间件,它会捕获应用程序中的错误并进行适当的处理,例如返回错误页面或发送错误响应。
- 静态文件服务:Express 允许你轻松地提供静态文件,如图像、CSS 和 JavaScript 文件。这对于构建具有前端界面的应用程序非常有用。
- 扩展性:Express 是一个非常灵活的框架,允许你根据项目的需求进行扩展。你可以使用其他库和中间件来增强 Express 的功能,使其适应不同的应用场景。
总体而言,Express 提供了一个简单而强大的框架来构建 Web 应用程序和 API。它的设计哲学是简洁、灵活和易于使用,使得开发者能够更快地构建出高效、可靠的 Node.js Web 服务器。
官网:https://expressjs.com/en/4x/api.html#req.body
二、安装
npm install express
三、express中间件
- express.json(optios): 用于解析请求的 JSON 数据。它会将请求的主体解析为 JSON 对象,并将其附加到 req.body 上
- inflate:设置是否处理压缩的请求主体。当设置为 false 时,拒绝处理压缩的请求主体。
- limit:控制请求主体的最大大小。如果是一个数字,表示以字节为单位的大小;如果是一个字符串,将使用 bytes 库解析该值。
- reviver:reviver 选项会直接传递给 JSON.parse 作为第二个参数。你可以在 MDN 的 JSON.parse 文档中找到有关该参数的更多信息。
- strict:设置是否仅接受数组和对象。当设置为 false 时,将接受 JSON.parse 可接受的任何类型。
- type:用于确定中间件将解析的媒体类型。该选项可以是一个字符串、字符串数组或一个函数。如果不是函数,type 选项将直接传递给 type-is 库,可以是扩展名(如 json)、媒体类型(如 application/json)或带通配符的媒体类型(如 / 或 */json)。如果是一个函数,将调用 fn(req),如果返回一个真值,将解析请求。
- verify:如果提供了该选项,将作为 verify(req, res, buf, encoding) 调用,其中 buf 是原始请求主体的 Buffer,encoding 是请求的编码方式。通过抛出错误,可以中止解析过程。
- express.raw(optios): 用于将请求的主体解析为原始的二进制数据。它会将原始数据附加到 req.body 上,可以在需要处理二进制数据的场景中使用。
- inflate:设置是否处理压缩的请求主体。当设置为 false 时,拒绝处理压缩的请求主体。
- limit:控制请求主体的最大大小。如果是一个数字,表示以字节为单位的大小;如果是一个字符串,将使用 bytes 库解析该值。
- type:用于确定中间件将解析的媒体类型。该选项可以是一个字符串、字符串数组或一个函数。如果不是函数,type 选项将直接传递给 type-is 库,可以是扩展名(如 bin)、媒体类型(如 application/octet-stream)或带通配符的媒体类型(如 / 或 application/*)。如果是一个函数,将调用 fn(req),如果返回一个真值,将解析请求。
- verify:如果提供了该选项,将作为 verify(req, res, buf, encoding) 调用,其中 buf 是原始请求主体的 Buffer,encoding 是请求的编码方式。通过抛出错误,可以中止解析过程。
- express.Router(optios): 创建可挂载的路由处理器的函数。它允许你将路由处理器模块化,并将其与主应用程序进行组合。可以创建多个路由器实例,每个实例都可以定义自己的路由和中间件。
- caseSensitive:启用大小写敏感模式。默认情况下禁用,将 “/Foo” 和 “/foo” 视为相同。
- mergeParams:保留来自父路由器(Router)的 req.params 值。如果父路由器和子路由器具有冲突的参数名称,子路由器的值将优先。
- strict:启用严格匹配模式。默认情况下禁用,将 “/foo” 和 “/foo/” 视为相同。
- express.static(root,optios): 用于提供静态文件的中间件函数。它可以指定一个包含静态文件的目录,并将这些文件作为响应发送给客户端。这对于提供静态资源文件(如图像、CSS 和 JavaScript 文件)非常有用。
- root:指定提供静态资源的根目录
- options:配置项
- dotfiles:确定如何处理点文件(以点“.”开头的文件或目录)。“ignore”:忽略点文件。“allow”:允许访问点文件。“deny”:拒绝访问点文件。
- etag:启用或禁用 ETag 生成。注意:express.static 始终发送弱 ETag。
- extensions:设置文件扩展名的回退选项。如果找不到文件,将搜索具有指定扩展名的文件,并返回找到的第一个文件。例如:[‘html’, ‘htm’]。
- fallthrough:控制客户端错误的处理方式。true:允许客户端错误继续传递,不作为未处理的请求。false:将客户端错误转发为客户端错误响应。
- immutable:启用或禁用 Cache-Control 响应头中的 immutable 指令。如果启用,还应指定 maxAge 选项以启用缓存。immutable 指令将阻止支持的客户端在 maxAge 期间进行条件请求,以检查文件是否已更改。
- index:发送指定的目录索引文件。设置为 false 以禁用目录索引。
- lastModified:将 Last-Modified 头设置为操作系统上文件的最后修改日期。
- maxAge:以毫秒或以毫秒格式的字符串设置 Cache-Control 头的 max-age 属性。
- redirect:当路径名为目录时,重定向到带有尾部“/”。
- setHeaders:用于设置与文件一起发送的 HTTP 头的函数。
- express.text(optios): 用于解析请求的主体为纯文本。它将请求的主体解析为字符串,并将其附加到 req.body 上。
- defaultCharset:如果请求的 Content-Type 头中未指定字符集,用于指定文本内容的默认字符集。默认为 “utf-8”。
- inflate:启用或禁用处理被压缩的请求体(deflated)。当禁用时,将拒绝包含压缩请求体的请求。默认为 true。
- limit:控制请求体的最大大小。如果是一个数字,则表示字节数;如果是一个字符串,则将其传递给字节库进行解析。例如:“100kb” 表示 100 KB。默认为 “100kb”。
- type:用于确定中间件将解析的媒体类型。该选项可以是一个字符串、字符串数组或一个函数。如果不是函数,则 type 选项直接传递给 type-is 库,可以是扩展名(如 txt)、媒体类型(如 text/plain)或带通配符的媒体类型(如 / 或 text/*)。如果是一个函数,则会调用 type 选项作为 fn(req),如果返回一个真值,则解析请求。默认为 “text/plain”。
- verify:如果提供了该选项,将作为 verify(req, res, buf, encoding) 调用,其中 buf 是原始请求体的 Buffer,encoding 是请求的编码。通过抛出错误可以中止解析过程。
- express.urlencoded(optios): 用于解析请求的主体为 URL 编码的数据。它将请求的主体解析为键值对的形式,并将其附加到 req.body 上。
- extended:该选项允许选择在解析 URL 编码数据时使用 querystring 库(当值为 false)还是 qs 库(当值为 true)。“extended” 语法允许将丰富的对象和数组编码为 URL 编码格式,从而实现类似 JSON 的体验。请参考 qs 库了解更多信息。默认为 true。
- inflate:启用或禁用处理被压缩的请求体(deflated)。当禁用时,将拒绝包含压缩请求体的请求。默认为 true。
- limit:控制请求体的最大大小。如果是一个数字,则表示字节数;如果是一个字符串,则将其传递给字节库进行解析。例如:“100kb” 表示 100 KB。默认为 “100kb”。
- parameterLimit:控制允许在 URL 编码数据中的参数的最大数量。如果请求包含超过此值的参数,将引发错误。默认为 1000。
- type:用于确定中间件将解析的媒体类型。该选项可以是一个字符串、字符串数组或一个函数。如果不是函数,则 type 选项直接传递给 type-is 库,可以是扩展名(如 urlencoded)、媒体类型(如 application/x-www-form-urlencoded)或带通配符的媒体类型(如 */x-www-form-urlencoded)。如果是一个函数,则会调用 type 选项作为 fn(req),如果返回一个真值,则解析请求。默认为 “application/x-www-form-urlencoded”。
- verify:如果提供了该选项,将作为 verify(req, res, buf, encoding) 调用,其中 buf 是原始请求体的 Buffer,encoding 是请求的编码。通过抛出错误可以中止解析过程。
四、创建程序对象
- app = express():创建express对象
- app.on(event, callback(parent)):事件监听器,用于在 Express 应用程序被挂载到其他应用程序或路由器时触发回调函数。
- error:当应用程序发生错误时触发。app.on(‘error’, callback) 来监听错误事件,并执行相应的错误处理逻辑。
- listening:当应用程序开始监听指定端口时触发。app.on(‘listening’, callback) 来监听监听事件,并在应用程序开始监听时执行相应的操作。
- close:当应用程序停止监听端口时触发。app.on(‘close’, callback) 来监听关闭事件,并在应用程序停止监听时执行相应的操作。
- mount:当应用程序被挂载到其他应用程序或路由器时触发。app.on(‘mount’, callback(parent)) 来监听挂载事件,并在应用程序被挂载时执行相应的操作。
- request:当应用程序收到请求时触发。app.on(‘request’, callback) 来监听请求事件,并在每次请求到达时执行相应的操作。
- route:当应用程序的路由被匹配时触发。app.on(‘route’, callback) 来监听路由事件,并在每次路由匹配时执行相应的操作。
- router:当应用程序的路由器被创建时触发。app.on(‘router’, callback) 来监听路由器事件,并在路由器创建时执行相应的操作。
- upgrade:当客户端发起 WebSocket 升级请求时触发。app.on(‘upgrade’, callback) 来监听升级事件,并执行相应的 WebSocket 处理逻辑。
- view engine:当应用程序的视图引擎被设置时触发。app.on(‘view engine’, callback) 来监听视图引擎事件,并在设置视图引擎时执行相应的操作。
- connect:当客户端连接到服务器时触发。app.on(‘connect’, callback) 来监听连接事件,并在客户端连接时执行相应的操作。
- checkContinue:当客户端发送 “Expect: 100-continue” 请求头时触发。app.on(‘checkContinue’, callback) 来监听 checkContinue 事件,并在收到该请求头时执行相应的操作。
- clientError:当客户端连接发生错误时触发。app.on(‘clientError’, callback) 来监听客户端错误事件,并执行相应的错误处理逻辑。
- app.locals:用于在应用程序的所有路由和中间件中共享变量。这些变量可以在视图中使用。
- app.mountpath:应用程序的挂载路径。如果应用程序是根应用程序,则该值为 ‘/’。
- app.all(path, callback [, callback …]):为指定的路径上的所有 HTTP 方法注册中间件或路由处理程序,回调函数返回req、res、 next
- app.delete(path, callback [, callback …]):为指定的路径注册一个处理 DELETE 请求的中间件或路由处理程序。
- app.disable(name):禁用指定的设置。
- app.disabled(name):检查指定的设置是否被禁用。
- app.enable(name):启用指定的设置。
- app.enabled(name):检查指定的设置是否被启用。
- app.engine(ext, callback):注册一个视图引擎回调函数来处理指定扩展名的模板文件。
- app.get(name):获取指定设置的值。
- app.get(path, callback [, callback …]):为指定的路径注册一个处理 GET 请求的中间件或路由处理程序,回调函数中返回req、res对象
- app.METHOD(path, callback [, callback …]):为指定的路径注册一个处理指定 HTTP 方法的中间件或路由处理程序
- app.param([name], callback):注册一个参数处理函数,用于处理指定名称的路由参数,回调函数返回req、res、 next、 id。
- app.path():返回应用程序的规范化的挂载路径模式。
- app.post(path, callback [, callback …]):为指定的路径注册一个处理 POST 请求的中间件或路由处理程序,回调函数中返回req、res对象
- app.put(path, callback [, callback …]):为指定的路径注册一个处理 PUT 请求的中间件或路由处理程序,回调函数中返回req、res对象
- app.render(view, [locals], callback):渲染指定的视图,并将结果作为回调函数的参数返回,回调函数返回err、html
- app.route(path):创建一个新的路由对象,并将其与指定的路径关联,返回app对象
- app.set(name, value):设置指定的设置的值。
- app.use([path,] callback [, callback…]):注册一个中间件函数或一组中间件函数,用于处理传入的请求。
五、request对象
- req.app:获取请求所属的 Express 应用程序对象。
- req.baseUrl:获取路由的基础 URL。
- req.body:获取请求的主体数据,通常用于处理 POST 请求的表单数据。
- req.cookies:获取请求中的 cookie。
- req.fresh:检查请求是否为 “新鲜”,即是否与客户端的缓存匹配。
- req.hostname:获取请求的主机名。
- req.ip:获取请求的 IP 地址。
- req.ips:获取请求经过的代理服务器的 IP 地址列表。
- req.method:获取请求的 HTTP 方法。
- req.originalUrl:获取原始的请求 URL。
- req.params:获取请求的路由参数。
- req.path:获取请求的路径。
- req.protocol:获取请求的协议。
- req.query:获取请求的查询参数。
- req.route:获取当前匹配的路由。
- req.secure:检查请求是否通过 HTTPS 协议发送。
- req.signedCookies:获取已签名的 cookie。
- req.stale:检查请求是否为 “陈旧”,即是否与客户端的缓存不匹配。
- req.subdomains:获取请求的子域名列表。
- req.xhr:检查请求是否由 XMLHttpRequest 发起。
- req.accepts(types):检查客户端是否接受给定的 MIME 类型或 MIME 类型数组。
- req.acceptsCharsets(charset [, …]):检查客户端是否接受给定的字符集或字符集数组。
- req.acceptsEncodings(encoding [, …]):检查客户端是否接受给定的编码或编码数组。
- req.acceptsLanguages(lang [, …]):检查客户端是否接受给定的语言或语言数组。
- req.get(field):获取请求头中指定字段的值。
- req.is(type):检查请求的 Content-Type 是否与给定的 MIME 类型匹配。
- req.param(name [, defaultValue]):获取路由参数、查询参数或请求体参数中指定名称的值。
- req.range(size[, options]):解析请求中的范围头字段,返回一个表示范围的对象。
六、response对象
- res.app:获取响应所属的 Express 应用程序对象。
- res.headersSent:检查响应头是否已发送。
- res.locals:用于在中间件函数中传递数据的对象。它是一个可用于存储和传递请求范围数据的对象,可以在请求处理链中的各个中间件函数之间共享数据。
- res.append(field [, value]):向响应头中添加指定字段的值。
- res.attachment([filename]):将响应头中的 Content-Disposition 设置为 “attachment”,可选地指定下载的文件名。
- res.cookie(name, value [, options]):设置响应的 cookie。options配置如下:
- domain(字符串):cookie 的域名。默认为应用程序的域名。
- encode(函数):用于对 cookie 值进行编码的同步函数。默认为 encodeURIComponent。
- expires(日期):cookie 的过期日期,使用 GMT 时间。如果未指定或设置为 0,则创建一个会话 cookie。
- httpOnly(布尔值):将 cookie 标记为仅可由 Web 服务器访问。
- maxAge(数字):相对于当前时间的毫秒数,方便地设置 cookie 的过期时间。
- path(字符串):cookie 的路径。默认为 “/”。
- priority(字符串):Set-Cookie 属性中的 “Priority” 值。
- secure(布尔值):将 cookie 标记为仅在 HTTPS 下使用。
- signed(布尔值):指示是否对 cookie 进行签名。
- sameSite(布尔值或字符串):Set-Cookie 属性中的 “SameSite” 值
- res.clearCookie(name [, options]):清除响应中指定的 cookie。options配置同res.cookie
- res.download(path [, filename] [, options] [, fn]):将文件作为附件下载。options配置如下:
- maxAge:以毫秒或以 “ms” 格式的字符串设置 Cache-Control 头中的 max-age 属性。默认为 0。
- root:相对于当前工作目录的根目录,用于指定文件的相对路径。从 Express 4.18+ 版本开始可用。
- lastModified:将 Last-Modified 头设置为操作系统上文件的最后修改日期。设置为 false 可禁用该功能。从 Express 4.16+ 版本开始启用。
- headers:包含要与文件一起发送的 HTTP 头的对象。Content-Disposition 头将被 filename 参数覆盖。
- dotfiles:用于处理以点开头的文件(dotfiles)的选项。可能的值为 “allow”、“deny” 和 “ignore”。默认为 “ignore”。
- acceptRanges:启用或禁用接受范围请求。默认为 true。
- cacheControl:启用或禁用设置 Cache-Control 响应头。默认为 true。
- immutable:启用或禁用 Cache-Control 响应头中的 immutable 指令。如果启用,还应指定 maxAge 选项以启用缓存。immutable 指令将阻止支持的客户端在 maxAge 选项的生命周期内进行条件请求,以检查文件是否已更改。
- res.sendFile(path [, options] [, fn]):以八进制流的形式发送文件。options配置同res.download
- res.end([data] [, encoding]):结束响应,可选择发送数据和指定编码。
- res.format(object):根据请求的 Accept 头选择性地发送不同的内容。
- res.get(field):获取指定响应头字段的值。
- res.json([body]):将 JSON 数据发送作为响应。
- res.jsonp([body]):将 JSONP 数据发送作为响应。
- res.links(links):设置响应头中的 Link 字段。
- res.location(path):设置响应的 Location 头。
- res.redirect([status,] path):重定向到指定的路径。
- res.render(view [, locals] [, callback]):渲染指定的视图模板并将其发送作为响应。
- res.send([body]):发送响应数据。
- res.sendStatus(statusCode):发送指定状态码的响应。
- res.set(field [, value]):设置响应头字段的值。
- res.status(code):设置响应的状态码。
- res.type(type):设置响应的 Content-Type 头。
- res.vary(field):向响应头中添加 Vary 字段。
七、路由对象:express.Router()
- router.all(path, [callback, …], callback):注册一个中间件函数,该函数将在指定路径上的所有请求方法上执行。
- router.METHOD(path, [callback, …], callback):注册一个中间件函数,该函数将在指定路径上的特定请求方法上执行。METHOD 是请求方法的名称,例如 get、post、put、delete 等。
- router.param(name, callback):注册一个参数处理函数,该函数将在路由处理链中的特定参数名称出现时执行。参数处理函数可用于在处理特定参数之前执行一些预处理逻辑。
- router.route(path):创建一个新的路由路径,可以在该路径上链式调用多个 HTTP 请求方法的处理函数。
- router.use([path], [function, …], function):注册一个中间件函数,该函数将在指定路径上的所有请求方法上执行。可选的路径参数用于限制中间件函数的执行范围。
八、示例
const express = require('express');
const app = express();
const port = 3000;
// 定义根路由处理程序,开启服务后访问http://localhost:3000
app.get('/', (req, res) => {
res.send('Hello, World!');
});
// 开启服务后访问http://localhost:3000/about
app.get('/about', (req, res) => {
res.send('About page');
});
//开启服务后访问http://localhost:3000/contact
app.get('/contact', (req, res) => {
res.send('Contact page');
});
// 启动服务器
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});