5.x API

Note

Express 5.0 requires Node.js 18 or higher.Express 5.0需要Node.js 18或更高版本。

express()

Creates an Express application. The express() function is a top-level function exported by the express module.创建Express应用程序。express()函数是express模块导出的顶级函数。

const express = require('express')
const app = express()

Methods方法

express.json([options])

This is a built-in middleware function in Express. 这是Express中内置的中间件功能。It parses incoming requests with JSON payloads and is based on body-parser.它使用JSON有效载荷解析传入的请求,并基于body-parser

Returns middleware that only parses JSON and only looks at requests where the Content-Type header matches the type option. 返回只解析JSON并且只查看Content-Type标头与type选项匹配的请求的中间件。This parser accepts any Unicode encoding of the body and supports automatic inflation of gzip and deflate encodings.此解析器接受正文的任何Unicode编码,并支持gzipdeflate编码的自动膨胀。

A new body object containing the parsed data is populated on the request object after the middleware (i.e. req.body), or undefined if there was no body to parse, the Content-Type was not matched, or an error occurred.在中间件之后,在request对象上填充包含解析数据的新body对象(即req.body),或者如果没有要解析的主体、Content-Type不匹配或发生错误,则填充undefined的主体对象。

As req.body’s shape is based on user-controlled input, all properties and values in this object are untrusted and should be validated before trusting.由于req.body的形状基于用户控制的输入,因此此对象中的所有属性和值都是不可信的,在信任之前应该进行验证。 For example, req.body.foo.toString() may fail in multiple ways, for example foo may not be there or may not be a string, and toString may not be a function and instead a string or other user-input.例如,req.body.foo.toString()可能会以多种方式失败,例如foo可能不存在或可能不是字符串,toString可能不是函数,而是字符串或其他用户输入。

The following table describes the properties of the optional options object.下表描述了可选options对象的属性。

Property属性 Description描述 Type类型 Default默认值
inflate Enables or disables handling deflated (compressed) bodies; when disabled, deflated bodies are rejected.启用或禁用处理放气(压缩)体;当禁用时,泄气的主体会被拒绝。 Boolean true
limit Controls the maximum request body size. If this is a number, then the value specifies the number of bytes; if it is a string, the value is passed to the bytes library for parsing.控制请求正文的最大大小。如果这是一个数字,则该值指定字节数;如果它是字符串,则将值传递给bytes库进行解析。 Mixed "100kb"
reviver The reviver option is passed directly to JSON.parse as the second argument. reviver选项作为第二个参数直接传递给JSON.parseYou can find more information on this argument in the MDN documentation about JSON.parse.您可以在有关JSONparse的MDN文档中找到有关此参数的更多信息。 Function null
strict Enables or disables only accepting arrays and objects; when disabled will accept anything JSON.parse accepts.启用或禁用仅接受数组和对象;当禁用时,将接受JSON.parse接受的任何内容。 Boolean true
type This is used to determine what media type the middleware will parse. This option can be a string, array of strings, or a function. 这用于确定中间件将解析哪种媒体类型。此选项可以是字符串、字符串数组或函数。If not a function, type option is passed directly to the type-is library and this can be an extension name (like json), a mime type (like application/json), or a mime type with a wildcard (like */* or */json). 如果不是函数,type选项将直接传递给type-is库,它可以是扩展名(如json)、mime类型(如application/json)或带通配符的mime类型(例如*/**/json)。If a function, the type option is called as fn(req) and the request is parsed if it returns a truthy value.如果是函数,则type选项被调用为fn(req),如果请求返回真值,则对其进行解析。 Mixed "application/json"
verify This option, if supplied, is called as verify(req, res, buf, encoding), where buf is a Buffer of the raw request body and encoding is the encoding of the request. The parsing can be aborted by throwing an error.如果提供此选项,则以verify(req, res, buf, encoding)的形式调用,其中buf是原始请求体的Bufferencoding是请求的编码。可以通过抛出错误来中止解析。 Function undefined

express.raw([options])

This is a built-in middleware function in Express. 这是Express中内置的中间件功能。It parses incoming request payloads into a Buffer and is based on body-parser.它将传入的请求有效载荷解析到Buffer中,并基于body-parser

Returns middleware that parses all bodies as a Buffer and only looks at requests where the Content-Type header matches the type option. 返回中间件,该中间件将所有主体解析为Buffer,并且只在Content-Type标头与Type选项匹配的情况下查看请求。This parser accepts any Unicode encoding of the body and supports automatic inflation of gzip and deflate encodings.此解析器接受正文的任何Unicode编码,并支持gzipdeflate编码的自动膨胀。

A new body Buffer containing the parsed data is populated on the request object after the middleware (i.e. req.body), or undefined if there was no body to parse, the Content-Type was not matched, or an error occurred.在中间件(即req.body)之后,在request对象上填充包含解析数据的新body Buffer,或者如果没有要解析的主体、内容类型不匹配或发生错误,则填充undefined的主体缓冲区。

As req.body’s shape is based on user-controlled input, all properties and values in this object are untrusted and should be validated before trusting.由于req.body的形状基于用户控制的输入,因此此对象中的所有属性和值都是不可信的,在信任之前应该进行验证。 For example, req.body.toString() may fail in multiple ways, for example stacking multiple parsers req.body may be from a different parser. 例如,req.body.toString()可能会以多种方式失败,例如堆叠多个解析器req.body可能来自不同的解析器。Testing that req.body is a Buffer before calling buffer methods is recommended.建议在调用缓冲区方法之前测试req.bodyBuffer

The following table describes the properties of the optional options object.下表描述了可选options对象的属性。

Property属性 Description描述 Type类型 Default默认值
inflate Enables or disables handling deflated (compressed) bodies; when disabled, deflated bodies are rejected.启用或禁用处理放气(压缩)体;当禁用时,泄气的主体会被拒绝。 Boolean true
limit Controls the maximum request body size. If this is a number, then the value specifies the number of bytes; if it is a string, the value is passed to the bytes library for parsing.控制请求正文的最大大小。如果这是一个数字,则该值指定字节数;如果它是字符串,则将值传递给bytes库进行解析。 Mixed "100kb"
type This is used to determine what media type the middleware will parse. 这用于确定中间件将解析哪种媒体类型。This option can be a string, array of strings, or a function.此选项可以是字符串、字符串数组或函数。 If not a function, type option is passed directly to the type-is library and this can be an extension name (like bin), a mime type (like application/octet-stream), or a mime type with a wildcard (like */* or application/*). 如果不是函数,type选项将直接传递给type-is库,它可以是扩展名(如bin)、mime类型(如application/octet-stream)或带通配符的mime类型,如*/*application/*If a function, the type option is called as fn(req) and the request is parsed if it returns a truthy value.如果是函数,则type选项被调用为fn(req),如果请求返回真值,则对其进行解析。 Mixed "application/octet-stream"
verify This option, if supplied, is called as verify(req, res, buf, encoding), where buf is a Buffer of the raw request body and encoding is the encoding of the request. 如果提供此选项,则以verify(req, res, buf, encoding)的形式调用,其中buf是原始请求体的Bufferencoding是请求的编码。The parsing can be aborted by throwing an error.可以通过抛出错误来中止解析。 Function undefined

express.Router([options])

Creates a new router object.创建新的router对象。

const router = express.Router([options])

The optional options parameter specifies the behavior of the router.可选options参数指定路由器的行为。

Property属性 Description描述 Default默认值 Availability可用性
caseSensitive Enable case sensitivity.启用区分大小写功能。 Disabled by default, treating “/Foo” and “/foo” as the same.默认情况下禁用,将“/Foo”和“/foo”视为相同。  
mergeParams Preserve the req.params values from the parent router. If the parent and the child have conflicting param names, the child’s value take precedence.保留父路由器中的req.params值。如果父级和子级具有冲突的参数名称,则子级的值优先。 false 4.5.0+
strict Enable strict routing.启用严格路由。 Disabled by default, “/foo” and “/foo/” are treated the same by the router.默认情况下禁用,路由器对“/foo”和“/foo/”的处理方式相同。  

You can add middleware and HTTP method routes (such as get, put, post, and so on) to router just like an application.您可以像应用程序一样向路由器添加中间件和HTTP方法路由(如getputpost等)。

For more information, see Router.有关更多信息,请参阅Router

express.static(root, [options])

This is a built-in middleware function in Express.这是Express中内置的中间件功能。 It serves static files and is based on serve-static.它提供静态文件,基于serve-static

NOTE: For best results, use a reverse proxy cache to improve performance of serving static assets.注意:为了获得最佳效果,请使用反向代理缓存来提高服务静态资产的性能。

The root argument specifies the root directory from which to serve static assets.root参数指定从中提供静态资产的根目录。 The function determines the file to serve by combining req.url with the provided root directory.该函数通过将req.url与提供的根目录组合来确定要服务的文件。 When a file is not found, instead of sending a 404 response, it instead calls next() to move on to the next middleware, allowing for stacking and fall-backs.当找不到文件时,它不是发送404响应,而是调用next()继续下一个中间件,允许堆叠和回退。

The following table describes the properties of the options object.下表描述了options对象的属性。 See also the example below.另请参阅下面的示例

Property属性 Description描述 Type类型 Default默认值
dotfiles Determines how dotfiles (files or directories that begin with a dot “.”) are treated.

See dotfiles below.
确定如何处理点文件(以点“.”开头的文件或目录)。请参阅下面的dotfiles
String “ignore”
etag Enable or disable etag generation

NOTE: express.static always sends weak ETags.
启用或禁用etag生成。注意:express.static总是发送弱etag。
Boolean true
extensions Sets file extension fallbacks: If a file is not found, search for files with the specified extensions and serve the first one found. Example: ['html', 'htm'].设置文件扩展名回退:如果找不到文件,请搜索具有指定扩展名的文件,并提供找到的第一个文件。示例:['html', 'htm'] Mixed false
fallthrough Let client errors fall-through as unhandled requests, otherwise forward a client error.

See fallthrough below.
让客户端错误作为未处理的请求处理,否则转发客户端错误。请参阅下面的fallthrough
Boolean true
immutable Enable or disable the immutable directive in the Cache-Control response header. 启用或禁用Cache-Control响应标头中的immutable指令。If enabled, the maxAge option should also be specified to enable caching. 如果启用,还应指定maxAge选项以启用缓存。The immutable directive will prevent supported clients from making conditional requests during the life of the maxAge option to check if the file has changed.不可变指令将阻止受支持的客户端在maxAge选项的生命周期内发出条件请求,以检查文件是否已更改。 Boolean false
index Sends the specified directory index file. Set to false to disable directory indexing.发送指定的目录索引文件。设置为false可禁用目录索引。 Mixed “index.html”
lastModified Set the Last-Modified header to the last modified date of the file on the OS.Last-Modified标头设置为操作系统上文件的最后修改日期。 Boolean true
maxAge Set the max-age property of the Cache-Control header in milliseconds or a string in ms format.设置Cache-Control标头的最大年龄属性(以毫秒为单位)或ms格式的字符串。 Number 0
redirect Redirect to trailing “/” when the pathname is a directory.当路径名是目录时,重定向到尾随的“/”。 Boolean true
setHeaders Function for setting HTTP headers to serve with the file.

See setHeaders below.
用于设置与文件一起使用的HTTP标头的函数。请参阅下面的setHeaders
Function  

For more information, see Serving static files in Express.有关更多信息,请参阅在Express中提供静态文件 and Using middleware - Built-in middleware.以及使用中间件——内置中间件

dotfiles

Possible values for this option are:此选项的可能值为:

  • “allow” - No special treatment for dotfiles.对点档案没有特殊处理。
  • “deny” - Deny a request for a dotfile, respond with 403, then call next().拒绝对点文件的请求,返回403,然后调用next()
  • “ignore” - Act as if the dotfile does not exist, respond with 404, then call next().假设点文件不存在,用404响应,然后调用next()
fallthrough

When this option is true, client errors such as a bad request or a request to a non-existent file will cause this middleware to simply call next() to invoke the next middleware in the stack.当此选项为true时,客户端错误(如错误的请求或对不存在的文件的请求)将导致此中间件简单地调用next()来调用堆栈中的下一个中间件。 When false, these errors (even 404s), will invoke next(err).当为false时,这些错误(甚至404)将调用next(err)

Set this option to true so you can map multiple physical directories to the same web address or for routes to fill in non-existent files.将此选项设置为true,以便您可以将多个物理目录映射到同一网址,或用于路由以填充不存在的文件。

Use false if you have mounted this middleware at a path designed to be strictly a single file system directory, which allows for short-circuiting 404s for less overhead. This middleware will also reply to all methods.如果您将此中间件安装在严格设计为单个文件系统目录的路径上,则使用false,这允许短路404以减少开销。此中间件还将回复所有方法。

setHeaders

For this option, specify a function to set custom response headers. Alterations to the headers must occur synchronously.对于此选项,指定一个函数来设置自定义响应标头。标题的更改必须同步进行。

The signature of the function is:函数的签名为:

fn(res, path, stat)

Arguments:论据:

  • res, the response object.,即响应对象
  • path, the file path that is being sent.,正在发送的文件路径。
  • stat, the stat object of the file that is being sent.,正在发送的文件的stat对象。

Example of express.staticexpress.static的示例

Here is an example of using the express.static middleware function with an elaborate options object:下面是一个使用express.static中间件函数和一个精心设计的选项对象的示例:

const options = {
  dotfiles: 'ignore',
  etag: false,
  extensions: ['htm', 'html'],
  index: false,
  maxAge: '1d',
  redirect: false,
  setHeaders (res, path, stat) {
    res.set('x-timestamp', Date.now())
  }
}

app.use(express.static('public', options))

express.text([options])

This is a built-in middleware function in Express. It parses incoming request payloads into a string and is based on body-parser.这是Express中内置的中间件功能。它将传入的请求有效载荷解析为字符串,并基于body-parser

Returns middleware that parses all bodies as a string and only looks at requests where the Content-Type header matches the type option. 返回中间件,该中间件将所有主体解析为字符串,并且只在Content-Type标头与type选项匹配的情况下查看请求。This parser accepts any Unicode encoding of the body and supports automatic inflation of gzip and deflate encodings.此解析器接受正文的任何Unicode编码,并支持gzipdeflate编码的自动膨胀。

A new body string containing the parsed data is populated on the request object after the middleware (i.e. req.body), or undefined if there was no body to parse, the Content-Type was not matched, or an error occurred.在中间件之后,在请求对象上填充包含解析数据的新body字符串(即req.body),或者如果没有要解析的正文、Content-Type不匹配或发生错误,则填充undefined的正文字符串。

As req.body’s shape is based on user-controlled input, all properties and values in this object are untrusted and should be validated before trusting.由于req.body的形状基于用户控制的输入,因此此对象中的所有属性和值都是不可信的,在信任之前应该进行验证。 For example, req.body.trim() may fail in multiple ways, for example stacking multiple parsers req.body may be from a different parser. 例如,req.body.trim()可能会以多种方式失败,例如堆叠多个解析器req.body可能来自不同的解析器。Testing that req.body is a string before calling string methods is recommended.建议在调用字符串方法之前测试req.body是一个字符串。

The following table describes the properties of the optional options object.下表描述了可选options对象的属性。

Property属性 Description描述 Type类型 Default默认值
defaultCharset Specify the default character set for the text content if the charset is not specified in the Content-Type header of the request.如果请求的Content-Type标头中未指定字符集,请指定文本内容的默认字符集。 String "utf-8"
inflate Enables or disables handling deflated (compressed) bodies; when disabled, deflated bodies are rejected.启用或禁用处理放气(压缩)体;当禁用时,泄气的身体会被拒绝。 Boolean true
limit Controls the maximum request body size. If this is a number, then the value specifies the number of bytes; if it is a string, the value is passed to the bytes library for parsing.控制请求正文的最大大小。如果这是一个数字,则该值指定字节数;如果它是字符串,则将值传递给bytes库进行解析。 Mixed "100kb"
type This is used to determine what media type the middleware will parse. This option can be a string, array of strings, or a function. 这用于确定中间件将解析哪种媒体类型。此选项可以是字符串、字符串数组或函数。If not a function, type option is passed directly to the type-is library and this can be an extension name (like txt), a mime type (like text/plain), or a mime type with a wildcard (like */* or text/*). 如果不是函数,type选项将直接传递给type-is库,它可以是扩展名(如txt)、mime类型(如text/plain)或带通配符的mime类型,如*/*text/*If a function, the type option is called as fn(req) and the request is parsed if it returns a truthy value.如果是函数,则type选项被调用为fn(req),如果请求返回真值,则对其进行解析。 Mixed "text/plain"
verify This option, if supplied, is called as verify(req, res, buf, encoding), where buf is a Buffer of the raw request body and encoding is the encoding of the request. The parsing can be aborted by throwing an error.如果提供此选项,则以verify(req, res, buf, encoding)的形式调用,其中buf是原始请求体的Buffer,encoding是请求的编码。可以通过抛出错误来中止解析。 Function undefined

express.urlencoded([options])

This is a built-in middleware function in Express. It parses incoming requests with urlencoded payloads and is based on body-parser.这是Express中内置的中间件功能。它使用url编码的有效载荷解析传入的请求,并基于body-parser

Returns middleware that only parses urlencoded bodies and only looks at requests where the Content-Type header matches the type option. 返回的中间件仅解析url编码的主体,并且只查找Content-Type标头与类型选项匹配的请求。This parser accepts only UTF-8 encoding of the body and supports automatic inflation of gzip and deflate encodings.此解析器只接受正文的UTF-8编码,并支持gzipdeflate编码的自动膨胀。

A new body object containing the parsed data is populated on the request object after the middleware (i.e. req.body), or undefined if there was no body to parse, the Content-Type was not matched, or an error occurred. 在中间件之后,在request对象上填充包含解析数据的新body对象(即req.body),或者如果没有要解析的主体、内容类型不匹配或发生错误,则填充 undefined主体对象。This object will contain key-value pairs, where the value can be a string or array (when extended is false), or any type (when extended is true).此对象将包含键值对,其中值可以是字符串或数组(当extendedfalse时),也可以是任何类型(当extendedtrue时)。

As req.body’s shape is based on user-controlled input, all properties and values in this object are untrusted and should be validated before trusting.由于req.body的形状基于用户控制的输入,因此此对象中的所有属性和值都是不可信的,在信任之前应该进行验证。 For example, req.body.foo.toString() may fail in multiple ways, for example foo may not be there or may not be a string, and toString may not be a function and instead a string or other user-input.例如,req.body.foo.toString()可能会以多种方式失败,例如foo可能不存在或可能不是字符串,toString可能不是函数,而是字符串或其他用户输入。

The following table describes the properties of the optional options object.下表描述了可选options对象的属性。

Property属性 Description描述 Type类型 Default默认值
extended This option allows to choose between parsing the URL-encoded data with the querystring library (when false) or the qs library (when true). 此选项允许在使用querystring库(false时)或qs库(true时)解析URL编码数据之间进行选择。The “extended” syntax allows for rich objects and arrays to be encoded into the URL-encoded format, allowing for a JSON-like experience with URL-encoded. “扩展”语法允许将丰富的对象和数组编码为URL编码格式,从而提供类似JSON的URL编码体验。For more information, please see the qs library.有关更多信息,请参阅qs库 Boolean false
inflate Enables or disables handling deflated (compressed) bodies; when disabled, deflated bodies are rejected.启用或禁用处理放气(压缩)体;当禁用时,泄气的身体会被拒绝。 Boolean true
limit Controls the maximum request body size. If this is a number, then the value specifies the number of bytes; if it is a string, the value is passed to the bytes library for parsing.控制请求正文的最大大小。如果这是一个数字,则该值指定字节数;如果它是字符串,则将值传递给bytes库进行解析。 Mixed "100kb"
parameterLimit This option controls the maximum number of parameters that are allowed in the URL-encoded data. If a request contains more parameters than this value, an error will be raised.此选项控制URL编码数据中允许的最大参数数。如果请求包含的参数多于此值,则会引发错误。 Number 1000
type This is used to determine what media type the middleware will parse. This option can be a string, array of strings, or a function. 这用于确定中间件将解析哪种媒体类型。此选项可以是字符串、字符串数组或函数。If not a function, type option is passed directly to the type-is library and this can be an extension name (like urlencoded), a mime type (like application/x-www-form-urlencoded), or a mime type with a wildcard (like */x-www-form-urlencoded). 如果不是函数,则type选项直接传递给type-is库,这可以是扩展名(如urlencoded)、mime类型(如*/x-www-form-urlencoded)或带通配符的mime类型,如*/x-www-form-urlencodedIf a function, the type option is called as fn(req) and the request is parsed if it returns a truthy value.如果是函数,则type选项被调用为fn(req),如果请求返回真值,则对其进行解析。 Mixed "application/x-www-form-urlencoded"
verify This option, if supplied, is called as verify(req, res, buf, encoding), where buf is a Buffer of the raw request body and encoding is the encoding of the request. 如果提供此选项,则以verify(req, res, buf, encoding)的形式调用,其中buf是原始请求体的Bufferencoding是请求的编码。The parsing can be aborted by throwing an error.可以通过抛出错误来中止解析。 Function undefined
depth Configure the maximum depth of the qs library when extended is true. extendedtrue时,配置qs库的最大深度。This allows you to limit the amount of keys that are parsed and can be useful to prevent certain types of abuse. 这允许您限制解析的键数量,并可用于防止某些类型的滥用。Defaults to 32. It is recommended to keep this value as low as possible.默认值为32。建议将此值保持尽可能低。 Number 32

Application

The app object conventionally denotes the Express application.app对象通常表示Express应用程序。 Create it by calling the top-level express() function exported by the Express module:通过调用Express模块导出的顶级express()函数来创建它:

const express = require('express')
const app = express()

app.get('/', (req, res) => {
  res.send('hello world')
})

app.listen(3000)

The app object has methods forapp对象具有以下方法

It also has settings (properties) that affect how the application behaves; for more information, see Application settings.它还具有影响应用程序行为的设置(属性);有关详细信息,请参阅应用程序设置

The Express application object can be referred from the request object and the response object as req.app, and res.app, respectively.Express应用程序对象可以从请求对象响应对象分别引用为req.appres.app

Properties属性

app.locals

The app.locals object has properties that are local variables within the application, and will be available in templates rendered with res.render.app.locals对象的属性是应用程序中的局部变量,将在使用res.render渲染的模板中可用。

The locals object is used by view engines to render a response. 视图引擎使用locals对象来呈现响应。The object keys may be particularly sensitive and should not contain user-controlled input, as it may affect the operation of the view engine or provide a path to cross-site scripting. 对象键可能特别敏感,不应包含用户控制的输入,因为它可能会影响视图引擎的运行或提供跨站点脚本的路径。Consult the documentation for the used view engine for additional considerations.有关其他注意事项,请参阅所用视图引擎的文档。

console.dir(app.locals.title)
// => 'My App'

console.dir(app.locals.email)
// => '[email protected]'

Once set, the value of app.locals properties persist throughout the life of the application, in contrast with res.locals properties that are valid only for the lifetime of the request.一旦设置,app.locals属性的值将在应用程序的整个生命周期内持续存在,而res.locals属性仅在请求的生命周期内有效。

You can access local variables in templates rendered within the application.您可以访问应用程序中呈现的模板中的局部变量。 This is useful for providing helper functions to templates, as well as application-level data.这对于为模板提供辅助函数以及应用程序级数据非常有用。 Local variables are available in middleware via req.app.locals (see req.app)局部变量可以通过req.app.locals在中间件中使用(请参阅req.app

app.locals.title = 'My App'
app.locals.strftime = require('strftime')
app.locals.email = '[email protected]'

app.mountpath

The app.mountpath property contains one or more path patterns on which a sub-app was mounted.app.mountpath属性包含一个或多个子应用程序挂载的路径模式。

A sub-app is an instance of express that may be used for handling the request to a route.子应用程序是express的一个实例,可用于处理对路线的请求。

const express = require('express')

const app = express() // the main app
const admin = express() // the sub app

admin.get('/', (req, res) => {
  console.log(admin.mountpath) // /admin
  res.send('Admin Homepage')
})

app.use('/admin', admin) // mount the sub app

It is similar to the baseUrl property of the req object, except req.baseUrl returns the matched URL path, instead of the matched patterns.它类似于req对象的baseUrl属性,除了req.baseUrl返回匹配的URL路径,而不是匹配的模式。

If a sub-app is mounted on multiple path patterns, app.mountpath returns the list of patterns it is mounted on, as shown in the following example.如果一个子应用程序被挂载在多个路径模式上,app.mountpath会返回它所挂载的模式列表,如下例所示。

const admin = express()

admin.get('/', (req, res) => {
  console.log(admin.mountpath) // [ '/adm{*splat}n', '/manager' ]
  res.send('Admin Homepage')
})

const secret = express()
secret.get('/', (req, res) => {
  console.log(secret.mountpath) // /secr{*splat}t
  res.send('Admin Secret')
})

admin.use('/secr{*splat}t', secret) // load the 'secret' router on '/secr{*splat}t', on the 'admin' sub app
app.use(['/adm{*splat}n', '/manager'], admin) // load the 'admin' router on '/adm{*splat}n' and '/manager', on the parent app

app.router

The application’s in-built instance of router. This is created lazily, on first access.该应用程序是路由器的内置实例。这是在首次访问时缓慢创建的。

const express = require('express')
const app = express()
const router = app.router

router.get('/', (req, res) => {
  res.send('hello world')
})

app.listen(3000)

You can add middleware and HTTP method routes to the router just like an application.您可以像应用程序一样向router添加中间件和HTTP方法路由。

For more information, see Router.有关更多信息,请参阅Router

Events事件

app.on('mount', callback(parent))

The mount event is fired on a sub-app, when it is mounted on a parent app. The parent app is passed to the callback function.当子应用被挂载到父应用时,mount事件会在子应用上触发。父应用程序被传递给回调函数。

NOTE

Sub-apps will:子应用程序将:

  • Not inherit the value of settings that have a default value. You must set the value in the sub-app.不继承具有默认值的设置值。您必须在子应用程序中设置该值。
  • Inherit the value of settings with no default value.继承没有默认值的设置值。

For details, see Application settings.有关详细信息,请参阅应用程序设置

const admin = express()

admin.on('mount', (parent) => {
  console.log('Admin Mounted')
  console.log(parent) // refers to the parent app
})

admin.get('/', (req, res) => {
  res.send('Admin Homepage')
})

app.use('/admin', admin)

Methods方法

app.all(path, callback [, callback ...])

This method is like the standard app.METHOD() methods, except it matches all HTTP verbs.此方法类似于标准的app.METHOD()方法,只是它匹配所有HTTP谓词。

Arguments参数

Argument参数 Description描述 Default默认值
path The path for which the middleware function is invoked. It can be any of the following:调用中间件函数的路径。它可以是以下任何一种:
  • A string representing a path.表示路径的字符串。
  • A path pattern.路径模式。
  • A regular expression pattern to match paths.匹配路径的正则表达式模式。
  • An array containing any combination of the above.包含上述任意组合的数组。
For examples, see Path examples.有关示例,请参阅路径示例
'/' (root path)
callback One or more callback functions. Accepted formats:一个或多个回调函数。接受的格式:
  • A single middleware function.单个中间件功能。
  • Multiple middleware functions separated by commas.多个中间件函数,用逗号分隔。
  • An array of middleware functions.一系列中间件功能。
  • A combination of the above.以上的组合。

You may provide multiple callbacks that behave like middleware. 您可以提供多个行为类似于中间件的回调。These can call next('route') to skip remaining callbacks for the current route.这些可以调用next('route')来跳过当前路由的剩余回调。 This is useful for conditional routing logic.这对于条件路由逻辑非常有用。

If a callback throws an error or returns a rejected promise, next(err) is invoked automatically.如果回调抛出错误或返回被拒绝的promise,next(err)将自动调用。

Since both router and app implement the middleware interface, they can also be used as callback middleware.由于routerapp都实现了中间件接口,因此它们也可以用作回调中间件。

For examples, see Middleware callback function examples.有关示例,请参阅中间件回调函数示例

None

Examples示例

The following callback is executed for requests to /secret whether using GET, POST, PUT, DELETE, or any other HTTP request method:无论是使用GET、POST、PUT、DELETE还是任何其他HTTP请求方法,都会对/secret的请求执行以下回调:

app.all('/secret', (req, res, next) => {
  console.log('Accessing the secret section ...')
  next() // pass control to the next handler
})

The app.all() method is useful for mapping “global” logic for specific path prefixes or arbitrary matches. For example, if you put the following at the top of all other route definitions, it requires that all routes from that point on require authentication, and automatically load a user. app.all()方法对于映射特定路径前缀或任意匹配的“全局”逻辑非常有用。例如,如果将以下内容放在所有其他路由定义的顶部,则要求从该点开始的所有路由都需要身份验证,并自动加载用户。Keep in mind that these callbacks do not have to act as end-points: loadUser can perform a task, then call next() to continue matching subsequent routes.请记住,这些回调不必充当端点:loadUser可以执行任务,然后调用next()继续匹配后续路由。

app.all('{*splat}', requireAuthentication, loadUser)

Or the equivalent:或等效物:

app.all('{*splat}', requireAuthentication)
app.all('{*splat}', loadUser)

Another example is white-listed “global” functionality.另一个例子是白名单“全局”功能。 The example is similar to the ones above, but it only restricts paths that start with “/api”:这个例子类似于上面的例子,但它只限制以“/api”开头的路径:

app.all('/api/{*splat}', requireAuthentication)

app.delete(path, callback [, callback ...])

Routes HTTP DELETE requests to the specified path with the specified callback functions.使用指定的回调函数将HTTP DELETE请求路由到指定的路径。 For more information, see the routing guide.有关更多信息,请参阅路线指南

Arguments参数

Argument论证 Description描述 Default默认值
path The path for which the middleware function is invoked. It can be any of the following:调用中间件函数的路径。它可以是以下任何一种:
  • A string representing a path.表示路径的字符串。
  • A path pattern.路径模式。
  • A regular expression pattern to match paths.匹配路径的正则表达式模式。
  • An array containing any combination of the above.包含上述任意组合的数组。
For examples, see Path examples.有关示例,请参阅路径示例
'/' (root path)
callback One or more callback functions. Accepted formats:一个或多个回调函数。接受的格式:
  • A single middleware function.单个中间件功能。
  • Multiple middleware functions separated by commas.多个中间件函数,用逗号分隔。
  • An array of middleware functions.一系列中间件功能。
  • A combination of the above.以上的组合。

You may provide multiple callbacks that behave like middleware. These can call next('route') to skip remaining callbacks for the current route.您可以提供多个行为类似于中间件的回调。这些可以调用next('route')来跳过当前路由的剩余回调。 This is useful for conditional routing logic.这对于条件路由逻辑非常有用。

If a callback throws an error or returns a rejected promise, next(err) is invoked automatically.如果回调抛出错误或返回被拒绝的promise,next(err)将自动调用。

Since both router and app implement the middleware interface, they can also be used as callback middleware.由于routerapp都实现了中间件接口,因此它们也可以用作回调中间件。

For examples, see Middleware callback function examples.有关示例,请参阅中间件回调函数示例

None

Example示例

app.delete('/', (req, res) => {
  res.send('DELETE request to homepage')
})

app.disable(name)

Sets the Boolean setting name to false, where name is one of the properties from the app settings table.将布尔设置name设置为false,其中name应用程序设置表中的属性之一。 Calling app.set('foo', false) for a Boolean property is the same as calling app.disable('foo').对布尔属性调用app.set('foo', false)与调用app.disable('foo')相同。

For example:例如:

app.disable('trust proxy')
app.get('trust proxy')
// => false

app.disabled(name)

Returns true if the Boolean setting name is disabled (false), where name is one of the properties from the app settings table.如果布尔设置name被禁用(false),则返回true,其中name应用程序设置表中的属性之一。

app.disabled('trust proxy')
// => true

app.enable('trust proxy')
app.disabled('trust proxy')
// => false

app.enable(name)

Sets the Boolean setting name to true, where name is one of the properties from the app settings table.将布尔设置name设置为true,其中name应用程序设置表中的属性之一。 Calling app.set('foo', true) for a Boolean property is the same as calling app.enable('foo').为布尔属性调用app.set('foo', true)与调用app.enable('foo')相同。

app.enable('trust proxy')
app.get('trust proxy')
// => true

app.enabled(name)

Returns true if the setting name is enabled (true), where name is one of the properties from the app settings table.如果启用了设置nametrue),则返回true,其中name应用程序设置表中的属性之一。

app.enabled('trust proxy')
// => false

app.enable('trust proxy')
app.enabled('trust proxy')
// => true

app.engine(ext, callback)

Registers the given template engine callback as ext.将给定的模板引擎callback注册为ext

By default, Express will require() the engine based on the file extension.默认情况下,Express将根据文件扩展名require()引擎。 For example, if you try to render a “foo.pug” file, Express invokes the following internally, and caches the require() on subsequent calls to increase performance.例如,如果您尝试渲染“foo.pug”文件,Express会在内部调用以下内容,并在后续调用中缓存require()以提高性能。

app.engine('pug', require('pug').__express)

Use this method for engines that do not provide .__express out of the box, or if you wish to “map” a different extension to the template engine.对于不提供开箱即用的.__express的发动机,或者如果你想将不同的扩展“映射”到模板引擎,请使用此方法。

For example, to map the EJS template engine to “.html” files:例如,要将EJS模板引擎映射到“.html”文件:

app.engine('html', require('ejs').renderFile)

In this case, EJS provides a .renderFile() method with the same signature that Express expects: (path, options, callback), though note that it aliases this method as ejs.__express internally so if you’re using “.ejs” extensions you don’t need to do anything.在这种情况下,EJS提供了一个.renderFile()方法,该方法具有Express所期望的相同签名:(path, options, callback),但请注意,它将此方法内部别名为ejs.__express,所以如果你使用的是“ejs”扩展,你什么都不需要做。

Some template engines do not follow this convention. 一些模板引擎不遵循此约定。The consolidate.js library maps Node template engines to follow this convention, so they work seamlessly with Express.consolidate.js库将Node模板引擎映射为遵循此约定,因此它们与Express无缝协作。

const engines = require('consolidate')
app.engine('haml', engines.haml)
app.engine('html', engines.hogan)

app.get(name)

Returns the value of name app setting, where name is one of the strings in the app settings table. For example:返回name app设置的值,其中name应用程序设置表中的字符串之一。例如:

app.get('title')
// => undefined

app.set('title', 'My Site')
app.get('title')
// => "My Site"

app.get(path, callback [, callback ...])

Routes HTTP GET requests to the specified path with the specified callback functions.使用指定的回调函数将HTTP GET请求路由到指定的路径。

Arguments参数

Argument论证 Description描述 Default默认值
path The path for which the middleware function is invoked. It can be any of the following:调用中间件函数的路径。它可以是以下任何一种:
  • A string representing a path.表示路径的字符串。
  • A path pattern.路径模式。
  • A regular expression pattern to match paths.匹配路径的正则表达式模式。
  • An array containing any combination of the above.包含上述任意组合的数组。
For examples, see Path examples.有关示例,请参阅路径示例
'/' (root path)
callback One or more callback functions. Accepted formats:一个或多个回调函数。接受的格式:
  • A single middleware function.单个中间件功能。
  • Multiple middleware functions separated by commas.多个中间件函数,用逗号分隔。
  • An array of middleware functions.一系列中间件功能。
  • A combination of the above.以上的组合。

You may provide multiple callbacks that behave like middleware. 您可以提供多个行为类似于中间件的回调。These can call next('route') to skip remaining callbacks for the current route.这些可以调用next('route')来跳过当前路由的剩余回调。 This is useful for conditional routing logic.这对于条件路由逻辑非常有用。

If a callback throws an error or returns a rejected promise, next(err) is invoked automatically.如果回调抛出错误或返回被拒绝的promise,next(err)将自动调用。

Since both router and app implement the middleware interface, they can also be used as callback middleware.由于routerapp都实现了中间件接口,因此它们也可以用作回调中间件。

For examples, see Middleware callback function examples.有关示例,请参阅中间件回调函数示例

None

For more information, see the routing guide.有关更多信息,请参阅路线指南

Example示例

app.get('/', (req, res) => {
  res.send('GET request to homepage')
})

app.listen(path, [callback])

Starts a UNIX socket and listens for connections on the given path.启动UNIX套接字并侦听给定路径上的连接。 This method is identical to Node’s http.Server.listen().此方法与Node的http.Server.listen()完全相同。

const express = require('express')
const app = express()
app.listen('/tmp/sock')

app.listen([port[, host[, backlog]]][, callback])

Binds and listens for connections on the specified host and port.绑定并侦听指定主机和端口上的连接。 This method is identical to Node’s http.Server.listen().此方法与Node的http.Server.listen()完全相同。

If port is omitted or is 0, the operating system will assign an arbitrary unused port, which is useful for cases like automated tasks (tests, etc.).如果端口被省略或为0,操作系统将分配一个任意未使用的端口,这对于自动化任务(测试等)等情况很有用。

const express = require('express')
const app = express()
app.listen(3000)

The app returned by express() is in fact a JavaScript Function, designed to be passed to Node’s HTTP servers as a callback to handle requests. express()返回的app实际上是一个JavaScript函数,旨在作为回调传递给Node的HTTP服务器以处理请求。This makes it easy to provide both HTTP and HTTPS versions of your app with the same code base, as the app does not inherit from these (it is simply a callback):这使得为应用程序的HTTP和HTTPS版本提供相同的代码库变得容易,因为应用程序不会继承这些代码(它只是一个回调):

const express = require('express')
const https = require('https')
const http = require('http')
const app = express()

http.createServer(app).listen(80)
https.createServer(options, app).listen(443)

The app.listen() method returns an http.Server object and (for HTTP) is a convenience method for the following:app.listen()方法返回一个http.Server对象,(对于HTTP)是一个方便的方法,用于以下操作:

app.listen = function () {
  const server = http.createServer(this)
  return server.listen.apply(server, arguments)
}

Note备注

All the forms of Node’s http.Server.listen() method are in fact actually supported.实际上,Node的http.Server.listen()方法的所有形式都得到了支持。

app.METHOD(path, callback [, callback ...])

Routes an HTTP request, where METHOD is the HTTP method of the request, such as GET, PUT, POST, and so on, in lowercase. 路由HTTP请求,其中METHOD是请求的HTTP方法,如GET、PUT、POST等,小写。Thus, the actual methods are app.get(), app.post(), app.put(), and so on. See Routing methods below for the complete list.因此,实际的方法是app.get()app.post()app.put()等。有关完整列表,请参阅下面的路由方法。

Arguments参数

Argument参数 Description描述 Default默认值
path The path for which the middleware function is invoked. It can be any of the following:调用中间件函数的路径。它可以是以下任何一种:
  • A string representing a path.表示路径的字符串。
  • A path pattern.路径模式。
  • A regular expression pattern to match paths.匹配路径的正则表达式模式。
  • An array containing any combination of the above.包含上述任意组合的数组。
For examples, see Path examples.有关示例,请参阅路径示例
'/' (root path)
callback One or more callback functions. Accepted formats:一个或多个回调函数。接受的格式:
  • A single middleware function.单个中间件功能。
  • Multiple middleware functions separated by commas.多个中间件函数,用逗号分隔。
  • An array of middleware functions.一系列中间件功能。
  • A combination of the above.以上的组合。

You may provide multiple callbacks that behave like middleware. These can call next('route') to skip remaining callbacks for the current route.您可以提供多个行为类似于中间件的回调。这些可以调用next('route')来跳过当前路由的剩余回调。 This is useful for conditional routing logic.这对于条件路由逻辑非常有用。

If a callback throws an error or returns a rejected promise, next(err) is invoked automatically.如果回调抛出错误或返回被拒绝的promise,next(err)将自动调用。

Since both router and app implement the middleware interface, they can also be used as callback middleware.由于routerapp都实现了中间件接口,因此它们也可以用作回调中间件。

For examples, see Middleware callback function examples.有关示例,请参阅中间件回调函数示例

None

Routing methods路由方法

Express supports the following routing methods corresponding to the HTTP methods of the same names:Express支持与同名HTTP方法对应的以下路由方法:

  • checkout
  • copy
  • delete
  • get
  • head
  • lock
  • merge
  • mkactivity
  • mkcol
  • move
  • m-search
  • notify
  • options
  • patch
  • post
  • purge
  • put
  • report
  • search
  • subscribe
  • trace
  • unlock
  • unsubscribe

The API documentation has explicit entries only for the most popular HTTP methods app.get(), app.post(), app.put(), and app.delete().API文档中只有最流行的HTTP方法app.get()app.post()app.put()app.delete()的显式条目。 However, the other methods listed above work in exactly the same way.然而,上面列出的其他方法的工作方式完全相同。

To route methods that translate to invalid JavaScript variable names, use the bracket notation. For example, app['m-search']('/', function ....要路由转换为无效JavaScript变量名的方法,请使用括号表示法。例如,app['m-search']('/', function ...

The app.get() function is automatically called for the HTTP HEAD method in addition to the GET method if app.head() was not called for the path before app.get().如果在app.get()之前没有对路径调用app.head(),则除了GET方法外,还会自动为HTTP HEAD方法调用app.get()函数。

The method, app.all(), is not derived from any HTTP method and loads middleware at the specified path for all HTTP request methods.方法app.all()不是从任何HTTP方法派生出来的,它在所有HTTP请求方法的指定路径上加载中间件。 For more information, see app.all.有关更多信息,请参阅app.all

For more information on routing, see the routing guide.有关路由的更多信息,请参阅路由指南

app.param(name, callback)

Add callback triggers to route parameters, where name is the name of the parameter or an array of them, and callback is the callback function. 路由参数中添加回调触发器,其中name是参数的名称或它们的数组,callback是回调函数。The parameters of the callback function are the request object, the response object, the next middleware, the value of the parameter and the name of the parameter, in that order.回调函数的参数依次是请求对象、响应对象、下一个中间件、参数值和参数名称。

If name is an array, the callback trigger is registered for each parameter declared in it, in the order in which they are declared. 如果name是一个数组,则会按照声明的顺序为其中声明的每个参数注册callback触发器。Furthermore, for each declared parameter except the last one, a call to next inside the callback will call the callback for the next declared parameter. 此外,对于除最后一个之外的每个声明参数,在回调函数中调用next将调用下一个声明参数的回调函数。For the last parameter, a call to next will call the next middleware in place for the route currently being processed, just like it would if name were just a string.对于最后一个参数,调用next将调用当前正在处理的路由的下一个中间件,就像name只是一个字符串一样。

For example, when :user is present in a route path, you may map user loading logic to automatically provide req.user to the route, or perform validations on the parameter input.例如,当:user出现在路由路径中时,您可以映射用户加载逻辑以自动向路由提供req.user,或对参数输入进行验证。

app.param('user', (req, res, next, id) => {
  // try to get the user details from the User model and attach it to the request object
  User.find(id, (err, user) => {
    if (err) {
      next(err)
    } else if (user) {
      req.user = user
      next()
    } else {
      next(new Error('failed to load user'))
    }
  })
})

Param callback functions are local to the router on which they are defined. They are not inherited by mounted apps or routers, nor are they triggered for route parameters inherited from parent routers. 参数回调函数是定义它们的路由器的本地函数。它们不会被挂载的应用程序或路由器继承,也不会因从父路由器继承的路由参数而触发。Hence, param callbacks defined on app will be triggered only by route parameters defined on app routes.因此,在app上定义的参数回调将仅由在app路由上定义的路由参数触发。

All param callbacks will be called before any handler of any route in which the param occurs, and they will each be called only once in a request-response cycle, even if the parameter is matched in multiple routes, as shown in the following examples.所有参数回调都将在参数出现的任何路由的任何处理程序之前调用,并且它们在请求-响应周期中只会被调用一次,即使参数在多个路由中匹配,如以下示例所示。

app.param('id', (req, res, next, id) => {
  console.log('CALLED ONLY ONCE')
  next()
})

app.get('/user/:id', (req, res, next) => {
  console.log('although this matches')
  next()
})

app.get('/user/:id', (req, res) => {
  console.log('and this matches too')
  res.end()
})

On GET /user/42, the following is printed:GET /user/42上打印以下内容:

CALLED ONLY ONCE
although this matches
and this matches too
app.param(['id', 'page'], (req, res, next, value) => {
  console.log('CALLED ONLY ONCE with', value)
  next()
})

app.get('/user/:id/:page', (req, res, next) => {
  console.log('although this matches')
  next()
})

app.get('/user/:id/:page', (req, res) => {
  console.log('and this matches too')
  res.end()
})

On GET /user/42/3, the following is printed:GET /user/42/3上打印以下内容:

CALLED ONLY ONCE with 42
CALLED ONLY ONCE with 3
although this matches
and this matches too

app.path()

Returns the canonical path of the app, a string.返回应用程序的规范路径,一个字符串。

const app = express()
const blog = express()
const blogAdmin = express()

app.use('/blog', blog)
blog.use('/admin', blogAdmin)

console.log(app.path()) // ''
console.log(blog.path()) // '/blog'
console.log(blogAdmin.path()) // '/blog/admin'

The behavior of this method can become very complicated in complex cases of mounted apps: it is usually better to use req.baseUrl to get the canonical path of the app.在安装应用程序的复杂情况下,此方法的行为可能会变得非常复杂:通常最好使用req.baseUrl来获取应用程序的规范路径。

app.post(path, callback [, callback ...])

Routes HTTP POST requests to the specified path with the specified callback functions.使用指定的回调函数将HTTP POST请求路由到指定的路径。 For more information, see the routing guide.有关更多信息,请参阅路线指南

Arguments参数

Argument参数 Description描述 Default默认值
path The path for which the middleware function is invoked. It can be any of the following:调用中间件函数的路径。它可以是以下任何一种:
  • A string representing a path.表示路径的字符串。
  • A path pattern.路径模式。
  • A regular expression pattern to match paths.匹配路径的正则表达式模式。
  • An array containing any combination of the above.包含上述任意组合的数组。
For examples, see Path examples.有关示例,请参阅路径示例
'/' (root path)
callback One or more callback functions. Accepted formats:一个或多个回调函数。接受的格式:
  • A single middleware function.单个中间件功能。
  • Multiple middleware functions separated by commas.多个中间件函数,用逗号分隔。
  • An array of middleware functions.一系列中间件功能。
  • A combination of the above.以上的组合。

You may provide multiple callbacks that behave like middleware. These can call next('route') to skip remaining callbacks for the current route.您可以提供多个行为类似于中间件的回调。这些可以调用next('route')来跳过当前路由的剩余回调。 This is useful for conditional routing logic.这对于条件路由逻辑非常有用。

If a callback throws an error or returns a rejected promise, next(err) is invoked automatically.如果回调抛出错误或返回被拒绝的promise,next(err)将自动调用。

Since both router and app implement the middleware interface, they can also be used as callback middleware.由于routerapp都实现了中间件接口,因此它们也可以用作回调中间件。

For examples, see Middleware callback function examples.有关示例,请参阅中间件回调函数示例

None

Example示例

app.post('/', (req, res) => {
  res.send('POST request to homepage')
})

app.put(path, callback [, callback ...])

Routes HTTP PUT requests to the specified path with the specified callback functions.使用指定的回调函数将HTTP PUT请求路由到指定的路径。

Arguments参数

Argument参数 Description描述 Default默认值
path The path for which the middleware function is invoked. It can be any of the following:调用中间件函数的路径。它可以是以下任何一种:
  • A string representing a path.表示路径的字符串。
  • A path pattern.路径模式。
  • A regular expression pattern to match paths.匹配路径的正则表达式模式。
  • An array containing any combination of the above.包含上述任意组合的数组。
For examples, see Path examples.有关示例,请参阅路径示例
'/' (root path)(根路径)
callback One or more callback functions. Accepted formats:一个或多个回调函数。接受的格式:
  • A single middleware function.单个中间件功能。
  • Multiple middleware functions separated by commas.多个中间件函数,用逗号分隔。
  • An array of middleware functions.一系列中间件功能。
  • A combination of the above.以上的组合。

You may provide multiple callbacks that behave like middleware. These can call next('route') to skip remaining callbacks for the current route.您可以提供多个行为类似于中间件的回调。这些可以调用next('route')来跳过当前路由的剩余回调。 This is useful for conditional routing logic.这对于条件路由逻辑非常有用。

If a callback throws an error or returns a rejected promise, next(err) is invoked automatically.如果回调抛出错误或返回被拒绝的promise,next(err)将自动调用。

Since both router and app implement the middleware interface, they can also be used as callback middleware.由于routerapp都实现了中间件接口,因此它们也可以用作回调中间件。

For examples, see Middleware callback function examples.有关示例,请参阅中间件回调函数示例

None

Example示例

app.put('/', (req, res) => {
  res.send('PUT request to homepage')
})

app.render(view, [locals], callback)

Returns the rendered HTML of a view via the callback function. 通过callback函数返回视图的渲染HTML。It accepts an optional parameter that is an object containing local variables for the view. 它接受一个可选参数,该参数是一个包含视图局部变量的对象。It is like res.render(), except it cannot send the rendered view to the client on its own.它类似于res.render(),只是它不能自己将渲染的视图发送到客户端。

Think of app.render() as a utility function for generating rendered view strings. Internally res.render() uses app.render() to render views.app.render()视为一个用于生成渲染视图字符串的实用函数。res.render()内部使用app.render()来渲染视图。

The view argument performs file system operations like reading a file from disk and evaluating Node.js modules, and as so for security reasons should not contain input from the end-user.view参数执行文件系统操作,如从磁盘读取文件和评估Node.js模块,因此出于安全原因,不应包含来自最终用户的输入。

The locals object is used by view engines to render a response. 视图引擎使用locals对象来呈现响应。The object keys may be particularly sensitive and should not contain user-controlled input, as it may affect the operation of the view engine or provide a path to cross-site scripting. 对象键可能特别敏感,不应包含用户控制的输入,因为它可能会影响视图引擎的运行或提供跨站点脚本的路径。Consult the documentation for the used view engine for additional considerations.有关其他注意事项,请参阅所用视图引擎的文档。

The local variable cache is reserved for enabling view cache. Set it to true, if you want to cache view during development; view caching is enabled in production by default.局部变量cache是为启用视图缓存而保留的。如果您想在开发过程中缓存视图,请将其设置为true;默认情况下,视图缓存在生产环境中启用。

app.render('email', (err, html) => {
  // ...
})

app.render('email', { name: 'Tobi' }, (err, html) => {
  // ...
})

app.route(path)

Returns an instance of a single route, which you can then use to handle HTTP verbs with optional middleware.返回单个路由的实例,然后您可以使用该实例通过可选中间件处理HTTP谓词。 Use app.route() to avoid duplicate route names (and thus typo errors).使用app.route()避免重复的路由名称(从而避免拼写错误)。

const app = express()

app.route('/events')
  .all((req, res, next) => {
    // runs for all HTTP verbs first
    // think of it as route specific middleware!
  })
  .get((req, res, next) => {
    res.json({})
  })
  .post((req, res, next) => {
    // maybe add a new event...
  })

app.set(name, value)

Assigns setting name to value. You may store any value that you want, but certain names can be used to configure the behavior of the server. 将设置name分配给value。您可以存储任何想要的值,但某些名称可用于配置服务器的行为。These special names are listed in the app settings table.这些特殊名称列在应用程序设置表中。

Calling app.set('foo', true) for a Boolean property is the same as calling app.enable('foo'). 为布尔属性调用app.set('foo', true)与调用app.enable('foo')相同。Similarly, calling app.set('foo', false) for a Boolean property is the same as calling app.disable('foo').同样地,对Boolean属性调用app.set('foo', false)与调用app.disable('foo')相同。

Retrieve the value of a setting with app.get().使用app.get()检索设置的值。

app.set('title', 'My Site')
app.get('title') // "My Site"

Application Settings设置

The following table lists application settings.下表列出了应用程序设置。

Note that sub-apps will:请注意,子应用程序将:

  • Not inherit the value of settings that have a default value. You must set the value in the sub-app.不继承具有默认值的设置值。您必须在子应用程序中设置该值。
  • Inherit the value of settings with no default value; these are explicitly noted in the table below.继承没有默认值的设置值;这些在下表中明确指出。

Exceptions: Sub-apps will inherit the value of trust proxy even though it has a default value (for backward-compatibility);例外情况:子应用程序将继承trust proxy的值,即使它有默认值(为了向后兼容性); Sub-apps will not inherit the value of view cache in production (when NODE_ENV is “production”).子应用程序在生产环境中不会继承view cache的值(当NODE_ENV为“production”时)。

Property属性Type类型Description描述Default默认值

case sensitive routing

Boolean

Enable case sensitivity. When enabled, "/Foo" and "/foo" are different routes.启用区分大小写功能。启用后,“/Foo”和“/foo”是不同的路由。 When disabled, "/Foo" and "/foo" are treated the same.禁用时,“/Foo”和“/foo”被视为相同。

NOTE: Sub-apps will inherit the value of this setting.:子应用程序将继承此设置的值。

N/A (undefined)

env

String Environment mode. Be sure to set to "production" in a production environment; see Production best practices: performance and reliability.环境模式。确保在生产环境中设置为“生产”模式;请参阅生产最佳实践:性能和可靠性

process.env.NODE_ENV (NODE_ENV environment variable) or “development” if NODE_ENV is not set.process.env.NODE_ENVNODE_ENV环境变量)或“development”(如果未设置NODE_ENV)。

etag

Varied

Set the ETag response header. For possible values, see the etag options table.设置ETag响应标头。有关可能的值,请参阅etag选项表

More about the HTTP ETag header.有关HTTP ETag标头的更多信息

weak

jsonp callback name

String Specifies the default JSONP callback name.指定默认JSONP回调名称。

“callback”

json escape

Boolean

Enable escaping JSON responses from the res.json, res.jsonp, and res.send APIs. 启用从res.jsonres.jsonpres.send API转义JSON响应。This will escape the characters <, >, and & as Unicode escape sequences in JSON. 这将转义字符<>&作为JSON中的Unicode转义序列。The purpose of this is to assist with mitigating certain types of persistent XSS attacks when clients sniff responses for HTML.这样做的目的是在客户端嗅探HTML响应时,帮助减轻某些类型的持久XSS攻击

NOTE: Sub-apps will inherit the value of this setting.:子应用程序将继承此设置的值。

N/A (undefined)

json replacer

Varied The 'replacer' argument used by `JSON.stringify`.

NOTE: Sub-apps will inherit the value of this setting.:子应用程序将继承此设置的值。

N/A (undefined)

json spaces

Varied The 'space' argument used by `JSON.stringify`.JSON.stringify使用的“space”参数 This is typically set to the number of spaces to use to indent prettified JSON.这通常设置为用于缩进美化JSON的空格数。

NOTE: Sub-apps will inherit the value of this setting.:子应用程序将继承此设置的值。

N/A (undefined)

query parser

Varied

Disable query parsing by setting the value to false, or set the query parser to use either “simple” or “extended” or a custom query string parsing function.通过将值设置为false禁用查询解析,或将查询解析器设置为使用“简单”或“扩展”或自定义查询字符串解析函数。

The simple query parser is based on Node’s native query parser, querystring.简单查询解析器基于Node的原生查询解析器querystring

The extended query parser is based on qs.扩展查询解析器基于qs

A custom query string parsing function will receive the complete query string, and must return an object of query keys and their values.自定义查询字符串解析函数将接收完整的查询字符串,并且必须返回查询键及其值的对象。

"simple"

strict routing

Boolean

Enable strict routing.启用严格路由。 When enabled, the router treats "/foo" and "/foo/" as different. Otherwise, the router treats "/foo" and "/foo/" as the same.启用后,路由器将“/foo”和“/foo/”视为不同。否则,路由器将“/foo”和“/foo/”视为相同。

NOTE: Sub-apps will inherit the value of this setting.:子应用程序将继承此设置的值。

N/A (undefined)

subdomain offset

Number The number of dot-separated parts of the host to remove to access subdomain.要删除以访问子域的主机的点分隔部分的数量。 2

trust proxy

Varied

Indicates the app is behind a front-facing proxy, and to use the X-Forwarded-* headers to determine the connection and the IP address of the client. NOTE: X-Forwarded-* headers are easily spoofed and the detected IP addresses are unreliable.表示应用程序位于前置代理后面,并使用X-Forwarded-*标头确定客户端的连接和IP地址。注意:X-Forwarded-*标头很容易被欺骗,检测到的IP地址也不可靠。

When enabled, Express attempts to determine the IP address of the client connected through the front-facing proxy, or series of proxies. 启用后,Express会尝试确定通过前置代理或一系列代理连接的客户端的IP地址。The `req.ips` property, then contains an array of IP addresses the client is connected through. req.ips属性包含客户端连接的IP地址数组。To enable it, use the values described in the trust proxy options table.要启用它,请使用信任代理选项表中描述的值。

The `trust proxy` setting is implemented using the proxy-addr package. For more information, see its documentation.trust proxy设置是使用proxy-addr包实现的。有关更多信息,请参阅其文档。

NOTE: Sub-apps will inherit the value of this setting, even though it has a default value.:子应用程序将继承此设置的值,即使它有默认值。

false (disabled)(禁用)

views

String or Array字符串或数组 A directory or an array of directories for the application's views. If an array, the views are looked up in the order they occur in the array.应用程序视图的目录或目录数组。如果是数组,则按照视图在数组中出现的顺序查找视图。

process.cwd() + '/views'

view cache

Boolean

Enables view template compilation caching.启用视图模板编译缓存。

NOTE: Sub-apps will not inherit the value of this setting in production (when `NODE_ENV` is "production").:子应用程序在生产环境中不会继承此设置的值(当`NODE_ENV`为“生产环境”时)。

true in production, otherwise undefined.在生产中为true,否则未定义。

view engine

String The default engine extension to use when omitted.省略时使用的默认引擎扩展名。

NOTE: Sub-apps will inherit the value of this setting.:子应用程序将继承此设置的值。

N/A (undefined)

x-powered-by

Boolean Enables the "X-Powered-By: Express" HTTP header.启用“X-Powered-By:Express”HTTP标头。

true

Options for `trust proxy` settingtrust proxy设置选项

Read Express behind proxies for more information.阅读代理背后的Express以获取更多信息。

Type类型Value
Boolean

If true, the client’s IP address is understood as the left-most entry in the X-Forwarded-* header.如果为true,则客户端的IP地址将被理解为X-Forwarded-*标头中最左侧的条目。

If false, the app is understood as directly facing the Internet and the client’s IP address is derived from req.connection.remoteAddress. This is the default setting.如果为false,则该应用程序被理解为直接面向互联网,客户端的IP地址来自req.connection.remoteAddress。这是默认设置。

String
String containing comma-separated values包含逗号分隔值的字符串
Array of strings字符串数组

An IP address, subnet, or an array of IP addresses, and subnets to trust. Pre-configured subnet names are:要信任的IP地址、子网或IP地址数组以及子网。预配置的子网名称为:

  • loopback回环 - 127.0.0.1/8, ::1/128
  • linklocal链接本地 - 169.254.0.0/16, fe80::/10
  • uniquelocal独特性 - 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7

Set IP addresses in any of the following ways:通过以下任一方式设置IP地址:

Specify a single subnet:指定一个子网:

app.set('trust proxy', 'loopback')

Specify a subnet and an address:指定子网和地址:

app.set('trust proxy', 'loopback, 123.123.123.123')

Specify multiple subnets as CSV:将多个子网指定为CSV格式:

app.set('trust proxy', 'loopback, linklocal, uniquelocal')

Specify multiple subnets as an array:将多个子网指定为数组:

app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal'])

When specified, the IP addresses or the subnets are excluded from the address determination process, and the untrusted IP address nearest to the application server is determined as the client’s IP address.指定后,IP地址或子网将被排除在地址确定过程之外,最靠近应用程序服务器的不受信任的IP地址将被确定为客户端的IP地址。

Number

Trust the nth hop from the front-facing proxy server as the client.信任前置代理服务器的第n跳作为客户端。

Function

Custom trust implementation. Use this only if you know what you are doing.自定义信任实现。只有当你知道自己在做什么时,才使用它。

app.set('trust proxy', (ip) => {
  if (ip === '127.0.0.1' || ip === '123.123.123.123') return true // trusted IPs
  else return false
})
Options for `etag` settingetag设置选项

NOTE: These settings apply only to dynamic files, not static files.:这些设置仅适用于动态文件,不适用于静态文件。 The express.static middleware ignores these settings.express.static中间件忽略这些设置。

The ETag functionality is implemented using the etag package.ETag功能是使用etag包实现的。 For more information, see its documentation.有关更多信息,请参阅其文档。

Type类型Value
Boolean

true enables weak ETag. This is the default setting.
false disables ETag altogether.
true启用弱ETag。这是默认设置。false完全禁用ETag。

String If "strong", enables strong ETag.
If "weak", enables weak ETag.
如果“strong”,则启用强ETag。如果“weak”,则启用弱ETag。
Function

Custom ETag function implementation. Use this only if you know what you are doing.自定义ETag函数实现。只有当你知道自己在做什么时,才使用它。

app.set('etag', (body, encoding) => {
  return generateHash(body, encoding) // consider the function is defined
})

app.use([path,] callback [, callback...])

Mounts the specified middleware function or functions at the specified path: the middleware function is executed when the base of the requested path matches path.在指定路径上挂载指定的一个或多个中间件函数:当请求路径的基匹配path时,执行中间件函数。

Arguments参数

Argument参数 Description描述 Default默认值
path The path for which the middleware function is invoked. It can be any of the following:调用中间件函数的路径。它可以是以下任何一种:
  • A string representing a path.表示路径的字符串。
  • A path pattern.路径模式。
  • A regular expression pattern to match paths.匹配路径的正则表达式模式。
  • An array containing any combination of the above.包含上述任意组合的数组。
For examples, see Path examples.有关示例,请参阅路径示例
'/' (root path)
callback One or more callback functions. Accepted formats:一个或多个回调函数。接受的格式:
  • A single middleware function.单个中间件功能。
  • Multiple middleware functions separated by commas.多个中间件函数,用逗号分隔。
  • An array of middleware functions.一系列中间件功能。
  • A combination of the above.以上的组合。

You may provide multiple callbacks that behave like middleware. These can call next('route') to skip remaining callbacks for the current route.您可以提供多个行为类似于中间件的回调。这些可以调用next('route')来跳过当前路由的剩余回调。 This is useful for conditional routing logic.这对于条件路由逻辑非常有用。

If a callback throws an error or returns a rejected promise, next(err) is invoked automatically.如果回调抛出错误或返回被拒绝的promise,next(err)将自动调用。

Since both router and app implement the middleware interface, they can also be used as callback middleware.由于routerapp都实现了中间件接口,因此它们也可以用作回调中间件。

For examples, see Middleware callback function examples.有关示例,请参阅中间件回调函数示例

None

Description描述

A route will match any path that follows its path immediately with a “/”.路线将立即用“/”匹配其路径后面的任何路径。 For example: app.use('/apple', ...) will match “/apple”, “/apple/images”, “/apple/images/news”, and so on.例如:app.use('/apple', ...)将匹配“/apple”、“/apple/images”、“/apple/images/news”等。

Since path defaults to “/”, middleware mounted without a path will be executed for every request to the app.由于path默认为“/”,因此对应用程序的每个请求都将执行没有路径的中间件。 For example, this middleware function will be executed for every request to the app:例如,将对应用程序的每个请求执行此中间件函数:

app.use((req, res, next) => {
  console.log('Time: %d', Date.now())
  next()
})

NOTE

Sub-apps will:子应用程序将:

  • Not inherit the value of settings that have a default value. You must set the value in the sub-app.不继承具有默认值的设置值。您必须在子应用程序中设置该值。
  • Inherit the value of settings with no default value.继承没有默认值的设置值。

For details, see Application settings.有关详细信息,请参阅应用程序设置

Middleware functions are executed sequentially, therefore the order of middleware inclusion is important.中间件功能是按顺序执行的,因此中间件包含的顺序很重要。

// this middleware will not allow the request to go beyond it
app.use((req, res, next) => {
  res.send('Hello World')
})

// requests will never reach this route
app.get('/', (req, res) => {
  res.send('Welcome')
})

Error-handling middleware错误处理中间件

Error-handling middleware always takes four arguments. You must provide four arguments to identify it as an error-handling middleware function. 错误处理中间件总是需要四个参数。您必须提供四个参数来将其标识为错误处理中间件函数。Even if you don’t need to use the next object, you must specify it to maintain the signature. 即使不需要使用下一个对象,也必须指定它来维护签名。Otherwise, the next object will be interpreted as regular middleware and will fail to handle errors. 否则,next对象将被解释为常规中间件,无法处理错误。For details about error-handling middleware, see: Error handling.有关错误处理中间件的详细信息,请参阅:错误处理

Define error-handling middleware functions in the same way as other middleware functions, except with four arguments instead of three, specifically with the signature (err, req, res, next)):以与其他中间件函数相同的方式定义错误处理中间件函数,除了使用四个参数而不是三个参数,特别是使用签名(err, req, res, next)

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

Path examples路径示例

The following table provides some simple examples of valid path values for mounting middleware.下表提供了安装中间件的有效path值的一些简单示例。

Type类型 Example示例
Path

Matches the exact path /abcd and any sub-paths starting with /abcd/ (for example, /abcd/foo):匹配确切的路径/abcd和以/abcd/开头的任何子路径(例如/abcd/foo):

app.use('/abcd', (req, res, next) => {
  next()
})
Path Pattern路径图案

This will match paths starting with /abcd and /abd:这将匹配以/abcd/abd开头的路径:

app.use('/ab{c}d', (req, res, next) => {
  next()
})
Regular Expression正则表达式

This will match paths starting with /abc and /xyz:这将匹配以/abc/xyz开头的路径:

app.use(/\/abc|\/xyz/, (req, res, next) => {
  next()
})
Array

This will match paths starting with /abcd, /xyza, /lmn, and /pqr:这将匹配以/abcd/xyza/lmn/pqr开头的路径:

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], (req, res, next) => {
  next()
})

Middleware callback function examples中间件回调函数示例

The following table provides some simple examples of middleware functions that can be used as the callback argument to app.use(), app.METHOD(), and app.all().下表提供了一些中间件函数的简单示例,这些函数可以用作app.use()app.METHOD()app.all()callback参数。

Usage用法 Example示例
Single Middleware单一中间件

You can define and mount a middleware function locally.您可以在本地定义和挂载中间件函数。

app.use((req, res, next) => {
  next()
})

A router is valid middleware.路由器是有效的中间件。

const router = express.Router()
router.get('/', (req, res, next) => {
  next()
})
app.use(router)

An Express app is valid middleware.Express应用程序是有效的中间件。

const subApp = express()
subApp.get('/', (req, res, next) => {
  next()
})
app.use(subApp)
Series of Middleware中间件系列

You can specify more than one middleware function at the same mount path.您可以在同一装载路径上指定多个中间件函数。

const r1 = express.Router()
r1.get('/', (req, res, next) => {
  next()
})

const r2 = express.Router()
r2.get('/', (req, res, next) => {
  next()
})

app.use(r1, r2)
Array数组

Use an array to group middleware logically.使用数组对中间件进行逻辑分组。

const r1 = express.Router()
r1.get('/', (req, res, next) => {
  next()
})

const r2 = express.Router()
r2.get('/', (req, res, next) => {
  next()
})

app.use([r1, r2])
Combination组合

You can combine all the above ways of mounting middleware.您可以将上述所有安装中间件的方法结合起来。

function mw1 (req, res, next) { next() }
function mw2 (req, res, next) { next() }

const r1 = express.Router()
r1.get('/', (req, res, next) => { next() })

const r2 = express.Router()
r2.get('/', (req, res, next) => { next() })

const subApp = express()
subApp.get('/', (req, res, next) => { next() })

app.use(mw1, [mw2, r1, r2], subApp)

Following are some examples of using the express.static middleware in an Express app.以下是在Express应用程序中使用express.static中间件的一些示例。

Serve static content for the app from the “public” directory in the application directory:从应用程序目录中的“public”目录为应用程序提供静态内容:

// GET /style.css etc
app.use(express.static(path.join(__dirname, 'public')))

Mount the middleware at “/static” to serve static content only when their request path is prefixed with “/static”:仅当中间件的请求路径前缀为“/static”时,才将中间件挂载到“/static”以提供静态内容:

// GET /static/style.css etc.
app.use('/static', express.static(path.join(__dirname, 'public')))

Disable logging for static content requests by loading the logger middleware after the static middleware:通过在静态中间件之后加载记录器中间件来禁用静态内容请求的日志记录:

app.use(express.static(path.join(__dirname, 'public')))
app.use(logger())

Serve static files from multiple directories, but give precedence to “./public” over the others:从多个目录提供静态文件,但优先使用“./public”:

app.use(express.static(path.join(__dirname, 'public')))
app.use(express.static(path.join(__dirname, 'files')))
app.use(express.static(path.join(__dirname, 'uploads')))

Request

The req object represents the HTTP request and has properties for the request query string, parameters, body, HTTP headers, and so on. req对象表示HTTP请求,并具有请求查询字符串、参数、正文、HTTP标头等属性。In this documentation and by convention, the object is always referred to as req (and the HTTP response is res) but its actual name is determined by the parameters to the callback function in which you’re working.在本文档中,按照惯例,对象始终称为req(HTTP响应为res),但其实际名称由您正在使用的回调函数的参数决定。

For example:例如:

app.get('/user/:id', (req, res) => {
  res.send(`user ${req.params.id}`)
})

But you could just as well have:但你也可以:

app.get('/user/:id', (request, response) => {
  response.send(`user ${request.params.id}`)
})

The req object is an enhanced version of Node’s own request object and supports all built-in fields and methods.req对象是Node自己的请求对象的增强版本,支持所有内置字段和方法

Properties

In Express 4, req.files is no longer available on the req object by default. 在Express 4中,默认情况下req.filesreq对象上不再可用。To access uploaded files on the req.files object, use multipart-handling middleware like busboy, multer, formidable, multiparty, connect-multiparty, or pez.要访问req.files对象上上传的文件,请使用多部分处理中间件,如busboymulterformidablemultipartyconnect-multipartypez

req.app

This property holds a reference to the instance of the Express application that is using the middleware.此属性包含对使用中间件的Express应用程序实例的引用。

If you follow the pattern in which you create a module that just exports a middleware function and require() it in your main file, then the middleware can access the Express instance via req.app如果您遵循以下模式,即创建一个仅导出中间件函数并在主文件中require()它的模块,那么中间件可以通过req.app访问Express实例

For example:例如:

// index.js
app.get('/viewdirectory', require('./mymiddleware.js'))
// mymiddleware.js
module.exports = (req, res) => {
  res.send(`The views directory is ${req.app.get('views')}`)
}

req.baseUrl

The URL path on which a router instance was mounted.装载路由器实例的URL路径。

The req.baseUrl property is similar to the mountpath property of the app object, except app.mountpath returns the matched path pattern(s).req.baseUrl属性类似于app对象的mountpath属性,只是app.mountpath返回匹配的路径模式。

For example:例如:

const greet = express.Router()

greet.get('/jp', (req, res) => {
  console.log(req.baseUrl) // /greet
  res.send('Konichiwa!')
})

app.use('/greet', greet) // load the router on '/greet'

Even if you use a path pattern or a set of path patterns to load the router, the baseUrl property returns the matched string, not the pattern(s). 即使您使用路径模式或一组路径模式来加载路由器,baseUrl属性也会返回匹配的字符串,而不是模式。In the following example, the greet router is loaded on two path patterns.在以下示例中,greet路由器加载在两种路径模式上。

app.use(['/gre:"param"t', '/hel{l}o'], greet) // load the router on '/gre:"param"t' and '/hel{l}o'

When a request is made to /greet/jp, req.baseUrl is “/greet”. When a request is made to /hello/jp, req.baseUrl is “/hello”.当向/greet/jp发出请求时,req.baseUrl为“/greet”。当向/hello/jp发出请求时,req.baseUrl为“/hello”。

req.body

Contains key-value pairs of data submitted in the request body.包含在请求正文中提交的数据的键值对。 By default, it is undefined, and is populated when you use body-parsing middleware such as express.json() or express.urlencoded().默认情况下,它是undefined,当您使用正文解析中间件(如express.json()express.urlencoded())时,它会被填充。

As req.body’s shape is based on user-controlled input, all properties and values in this object are untrusted and should be validated before trusting. 由于req.body的形状基于用户控制的输入,因此此对象中的所有属性和值都是不可信的,在信任之前应该进行验证。For example, req.body.foo.toString() may fail in multiple ways, for example foo may not be there or may not be a string, and toString may not be a function and instead a string or other user-input.例如,req.body.foo.toString()可能会以多种方式失败,例如foo可能不存在或可能不是字符串,toString可能不是函数,而是字符串或其他用户输入。

The following example shows how to use body-parsing middleware to populate req.body.以下示例显示了如何使用body解析中间件来填充req.body

const express = require('express')

const app = express()

app.use(express.json()) // for parsing application/json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded

app.post('/profile', (req, res, next) => {
  console.log(req.body)
  res.json(req.body)
})

req.cookies

When using cookie-parser middleware, this property is an object that contains cookies sent by the request. If the request contains no cookies, it defaults to {}.使用cookie-parser中间件时,此属性是一个包含请求发送的cookie的对象。如果请求不包含Cookie,则默认为{}

// Cookie: name=tj
console.dir(req.cookies.name)
// => "tj"

If the cookie has been signed, you have to use req.signedCookies.如果cookie已签名,则必须使用req.signedCookies

For more information, issues, or concerns, see cookie-parser.有关更多信息、问题或疑虑,请参阅cookie-parser

req.fresh

When the response is still “fresh” in the client’s cache true is returned, otherwise false is returned to indicate that the client cache is now stale and the full response should be sent.当响应在客户端缓存中仍然“新鲜”时,返回true,否则返回false,表示客户端缓存现在已过时,应发送完整响应。

When a client sends the Cache-Control: no-cache request header to indicate an end-to-end reload request, this module will return false to make handling these requests transparent.当客户端发送Cache-Control: no-cache请求标头以指示端到端的重新加载请求时,此模块将返回false以使处理这些请求透明。

Further details for how cache validation works can be found in the HTTP/1.1 Caching Specification.有关缓存验证如何工作的更多详细信息,请参阅HTTP/1.1缓存规范

console.dir(req.fresh)
// => true

req.host

Contains the host derived from the Host HTTP header.包含从Host HTTP标头派生的主机。

When the trust proxy setting does not evaluate to false, this property will instead get the value from the X-Forwarded-Host header field. trust proxy设置未评估为false时,此属性将从X-Forwarded-Host标头字段获取值。This header can be set by the client or by the proxy.此标头可以由客户端或代理设置。

If there is more than one X-Forwarded-Host header in the request, the value of the first header is used. 如果请求中有多个X-Forwarded-Host标头,则使用第一个标头的值。This includes a single header with comma-separated values, in which the first value is used.这包括一个逗号分隔值的单个标头,其中使用了第一个值。

// Host: "example.com:3000"
console.dir(req.host)
// => 'example.com:3000'

// Host: "[::1]:3000"
console.dir(req.host)
// => '[::1]:3000'

req.hostname

Contains the hostname derived from the Host HTTP header.包含从Host HTTP标头派生的主机名。

When the trust proxy setting does not evaluate to false, this property will instead get the value from the X-Forwarded-Host header field. trust proxy设置未评估为false时,此属性将从X-Forwarded-Host标头字段获取值。This header can be set by the client or by the proxy.此标头可以由客户端或代理设置。

If there is more than one X-Forwarded-Host header in the request, the value of the first header is used. This includes a single header with comma-separated values, in which the first value is used.如果请求中有多个X-Forwarded-Host标头,则使用第一个标头的值。这包括一个逗号分隔值的单个标头,其中使用了第一个值。

Prior to Express v4.17.0, the X-Forwarded-Host could not contain multiple values or be present more than once.在Express v4.17.0之前,X-Forwarded-Host不能包含多个值或出现多次。

// Host: "example.com:3000"
console.dir(req.hostname)
// => 'example.com'

req.ip

Contains the remote IP address of the request.包含请求的远程IP地址。

When the trust proxy setting does not evaluate to false, the value of this property is derived from the left-most entry in the X-Forwarded-For header. trust proxy设置未计算为false时,此属性的值将从X-Forwarded-For标头中最左侧的条目中导出。This header can be set by the client or by the proxy.此标头可以由客户端或代理设置。

console.dir(req.ip)
// => "127.0.0.1"

req.ips

When the trust proxy setting does not evaluate to false, this property contains an array of IP addresses specified in the X-Forwarded-For request header. trust proxy设置未计算为false时,此属性包含X-Forwarded-For请求标头中指定的IP地址数组。Otherwise, it contains an empty array. This header can be set by the client or by the proxy.否则,它包含一个贫血的数组。此标头可以由客户端或代理设置。

For example, if X-Forwarded-For is client, proxy1, proxy2, req.ips would be ["client", "proxy1", "proxy2"], where proxy2 is the furthest downstream.例如,如果X-Forwarded-Forclient, proxy1, proxy2req.ips将是["client", "proxy1", "proxy2"],其中proxy2是最下游的。

req.method

Contains a string corresponding to the HTTP method of the request: GET, POST, PUT, and so on.包含与请求的HTTP方法相对应的字符串:GETPOSTPUT等。

req.originalUrl

req.url is not a native Express property, it is inherited from Node’s http module.不是本机Express属性,它继承自Node的http模块

This property is much like req.url; however, it retains the original request URL, allowing you to rewrite req.url freely for internal routing purposes. 这个属性很像req.url;但是,它保留了原始请求URL,允许您出于内部路由目的自由重写req.urlFor example, the “mounting” feature of app.use() will rewrite req.url to strip the mount point.例如,app.use()的“挂载”特性将重写req.url以剥离挂载点。

// GET /search?q=something
console.dir(req.originalUrl)
// => "/search?q=something"

req.originalUrl is available both in middleware and router objects, and is a combination of req.baseUrl and req.url. Consider following example:req.originalUrl在中间件和路由器对象中都可用,是req.baseUrlreq.url的组合。考虑以下示例:

// GET 'http://www.example.com/admin/new?sort=desc'
app.use('/admin', (req, res, next) => {
  console.dir(req.originalUrl) // '/admin/new?sort=desc'
  console.dir(req.baseUrl) // '/admin'
  console.dir(req.path) // '/new'
  next()
})

req.params

This property is an object containing properties mapped to the named route “parameters”. 此属性是一个包含映射到命名路由“参数”的属性的对象。For example, if you have the route /user/:name, then the “name” property is available as req.params.name. This object defaults to {}.例如,如果您有route/user/:name,则“name”属性可用作req.params.name。此对象默认为{}

// GET /user/tj
console.dir(req.params.name)
// => "tj"

When you use a regular expression for the route definition, capture groups are provided in the array using req.params[n], where n is the nth capture group.当您使用正则表达式进行路由定义时,数组中会使用req.params[n]提供捕获组,其中n是第n个捕获组。

app.use(/^\/file\/(.*)$/, (req, res) => {
  // GET /file/javascripts/jquery.js
  console.dir(req.params[0])
  // => "javascripts/jquery.js"
})

If you need to make changes to a key in req.params, use the app.param handler. Changes are applicable only to parameters already defined in the route path.如果需要更改req.params中的键,请使用app.param处理程序。更改仅适用于路线路径中已定义的参数

Any changes made to the req.params object in a middleware or route handler will be reset.对中间件或路由处理程序中的req.params对象所做的任何更改都将被重置。

Note

Express automatically decodes the values in req.params (using decodeURIComponent).Express会自动解码req.params中的值(使用decodeURIComponent)。

req.path

Contains the path part of the request URL.包含请求URL的路径部分。

// example.com/users?sort=desc
console.dir(req.path)
// => "/users"

When called from a middleware, the mount point is not included in req.path. See app.use() for more details.当从中间件调用时,挂载点不包含在req.path中。有关更多详细信息,请参阅app.use()

req.protocol

Contains the request protocol string: either http or (for TLS requests) https.包含请求协议字符串:http或(对于TLS请求)https

When the trust proxy setting does not evaluate to false, this property will use the value of the X-Forwarded-Proto header field if present.trust proxy设置未评估为false时,此属性将使用X-Forwarded-Proto标头字段的值(如果存在)。 This header can be set by the client or by the proxy.此标头可以由客户端或代理设置。

console.dir(req.protocol)
// => "http"

req.query

This property is an object containing a property for each query string parameter in the route.此属性是一个对象,包含路由中每个查询字符串参数的属性。 When query parser is set to disabled, it is an empty object {}, otherwise it is the result of the configured query parser.查询解析器设置为禁用时,它是一个空对象{},否则它是配置的查询解析器的结果。

As req.query’s shape is based on user-controlled input, all properties and values in this object are untrusted and should be validated before trusting. 由于req.query的形状基于用户控制的输入,因此此对象中的所有属性和值都是不受信任的,应在信任之前进行验证。For example, req.query.foo.toString() may fail in multiple ways, for example foo may not be there or may not be a string, and toString may not be a function and instead a string or other user-input.例如,req.query.foo.toString()可能会以多种方式失败,例如foo可能不存在或可能不是字符串,toString可能不是函数,而是字符串或其他用户输入。

The value of this property can be configured with the query parser application setting to work how your application needs it. 此属性的值可以使用查询解析器应用程序设置进行配置,以满足应用程序的需求。A very popular query string parser is the qs module, and this is used by default. 一个非常流行的查询字符串解析器是qs模块,默认情况下使用它。The qs module is very configurable with many settings, and it may be desirable to use different settings than the default to populate req.query:qs模块可以通过许多设置进行配置,可能需要使用与默认设置不同的设置来填充req.query

const qs = require('qs')
app.set('query parser',
  (str) => qs.parse(str, { /* custom options */ }))

Check out the query parser application setting documentation for other customization options.查看查询解析器应用程序设置文档,了解其他自定义选项。

req.res

This property holds a reference to the response object that relates to this request object.此属性包含对与此请求对象相关的响应对象的引用。

req.route

Contains the currently-matched route, a string. For example:包含当前匹配的路由,一个字符串。例如:

app.get('/user/{:id}', (req, res) => {
  console.dir(req.route, { depth: null })
  res.send('GET')
})

Example output from the previous snippet:上一段代码的示例输出:

Route {
  path: '/user/{:id}',
  stack: [
    Layer {
      handle: [Function (anonymous)],
      keys: [],
      name: '<anonymous>',
      params: undefined,
      path: undefined,
      slash: false,
      matchers: [ [Function: match] ],
      method: 'get'
    }
  ],
  methods: [Object: null prototype] { get: true }
}

req.secure

A Boolean property that is true if a TLS connection is established. Equivalent to the following:一个布尔属性,如果建立了TLS连接,则为true。相当于以下内容:

req.protocol === 'https'

req.signedCookies

When using cookie-parser middleware, this property contains signed cookies sent by the request, unsigned and ready for use. 使用cookie-parser中间件时,此属性包含由请求发送的已签名cookie、未签名cookie和可供使用的cookie。Signed cookies reside in a different object to show developer intent; otherwise, a malicious attack could be placed on req.cookie values (which are easy to spoof). 签名的Cookie驻留在不同的对象中,以显示开发人员的意图;否则,req.cookie值(很容易被欺骗)可能会受到恶意攻击。Note that signing a cookie does not make it “hidden” or encrypted; but simply prevents tampering (because the secret used to sign is private).请注意,对cookie进行签名并不会使其“隐藏”或加密;但只是防止篡改(因为用于签名的秘密是私有的)。

If no signed cookies are sent, the property defaults to {}.如果没有发送签名的Cookie,则属性默认为{}

// Cookie: user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3
console.dir(req.signedCookies.user)
// => "tobi"

For more information, issues, or concerns, see cookie-parser.有关更多信息、问题或疑虑,请参阅cookie解析器

req.stale

Indicates whether the request is “stale,” and is the opposite of req.fresh. For more information, see req.fresh.指示请求是否“过时”,是否与req.fresh相反。有关更多信息,请参阅req.fresh

console.dir(req.stale)
// => true

req.subdomains

An array of subdomains in the domain name of the request.请求域名中的子域数组。

// Host: "tobi.ferrets.example.com"
console.dir(req.subdomains)
// => ["ferrets", "tobi"]

The application property subdomain offset, which defaults to 2, is used for determining the beginning of the subdomain segments. 应用程序属性subdomain offset默认为2,用于确定子域段的起始位置。To change this behavior, change its value using app.set.要更改此行为,请使用app.set更改其值。

req.xhr

A Boolean property that is true if the request’s X-Requested-With header field is “XMLHttpRequest”, indicating that the request was issued by a client library such as jQuery.如果请求的X-Requested-With头字段为“XMLHttpRequest”,则布尔属性为true,表示该请求是由jQuery等客户端库发出的。

console.dir(req.xhr)
// => true

Methods

req.accepts(types)

Checks if the specified content types are acceptable, based on the request’s Accept HTTP header field.根据请求的Accept HTTP标头字段检查指定的内容类型是否可接受。 The method returns the best match, or if none of the specified content types is acceptable, returns false (in which case, the application should respond with 406 "Not Acceptable").该方法返回最佳匹配,或者如果指定的内容类型都不可接受,则返回false(在这种情况下,应用程序应返回406 "Not Acceptable")。

The type value may be a single MIME type string (such as “application/json”), an extension name such as “json”, a comma-delimited list, or an array. type值可以是单个MIME类型字符串(如“application/json”)、扩展名(如“json”)、逗号分隔的列表或数组。For a list or array, the method returns the best match (if any).对于list或array,该方法返回最佳匹配(如果有的话)。

// Accept: text/html
req.accepts('html')
// => "html"

// Accept: text/*, application/json
req.accepts('html')
// => "html"
req.accepts('text/html')
// => "text/html"
req.accepts(['json', 'text'])
// => "json"
req.accepts('application/json')
// => "application/json"

// Accept: text/*, application/json
req.accepts('image/png')
req.accepts('png')
// => false

// Accept: text/*;q=.5, application/json
req.accepts(['html', 'json'])
// => "json"

For more information, or if you have issues or concerns, see accepts.有关更多信息,或者如果您有问题或疑虑,请参阅accepts

req.acceptsCharsets(charset [, ...])

Returns the first accepted charset of the specified character sets, based on the request’s Accept-Charset HTTP header field.根据请求的Accept-Charset HTTP标头字段,返回指定字符集的第一个被接受的字符集。 If none of the specified charsets is accepted, returns false.如果指定的字符集都不被接受,则返回false

For more information, or if you have issues or concerns, see accepts.有关更多信息,或者如果您有问题或疑虑,请参阅accepts

req.acceptsEncodings(encoding [, ...])

Returns the first accepted encoding of the specified encodings, based on the request’s Accept-Encoding HTTP header field.根据请求的Accept-Encoding HTTP标头字段,返回指定编码的第一个被接受的编码。 If none of the specified encodings is accepted, returns false.如果指定的编码都不被接受,则返回false

For more information, or if you have issues or concerns, see accepts.有关更多信息,或者如果您有问题或疑虑,请参阅accepts

req.acceptsLanguages([lang, ...])

Returns the first accepted language of the specified languages, based on the request’s Accept-Language HTTP header field.根据请求的Accept-Language HTTP标头字段,返回指定语言中第一个被接受的语言。 If none of the specified languages is accepted, returns false.如果指定的语言都不被接受,则返回false

If no lang argument is given, then req.acceptsLanguages() returns all languages from the HTTP Accept-Language header as an Array.如果没有给出lang参数,则req.acceptsLanguages()将从HTTP Accept-Language头部返回所有语言作为数组。

For more information, or if you have issues or concerns, see accepts.有关更多信息,或者如果您有问题或疑虑,请参阅accepts

Express (5.x) source: Express(5x)来源:request.js line 172

Accepts (2.0) source: Accepts(2.0)来源:index.js line 195

req.get(field)

Returns the specified HTTP request header field (case-insensitive match).返回指定的HTTP请求标头字段(不区分大小写的匹配)。 The Referrer and Referer fields are interchangeable.ReferrerReferer字段可以互换。

req.get('Content-Type')
// => "text/plain"

req.get('content-type')
// => "text/plain"

req.get('Something')
// => undefined

Aliased as req.header(field).别名为req.header(field)

req.is(type)

Returns the matching content type if the incoming request’s “Content-Type” HTTP header field matches the MIME type specified by the type parameter. 如果传入请求的“content-type”HTTP标头字段与type参数指定的MIME类型匹配,则返回匹配的内容类型。If the request has no body, returns null.如果请求没有正文,则返回null Returns false otherwise.否则返回false

// With Content-Type: text/html; charset=utf-8
req.is('html') // => 'html'
req.is('text/html') // => 'text/html'
req.is('text/*') // => 'text/*'

// When Content-Type is application/json
req.is('json') // => 'json'
req.is('application/json') // => 'application/json'
req.is('application/*') // => 'application/*'

// Using arrays
// When Content-Type is application/json
req.is(['json', 'html']) // => 'json'

// Using multiple arguments
// When Content-Type is application/json
req.is('json', 'html') // => 'json'

req.is('html') // => false
req.is(['xml', 'yaml']) // => false
req.is('xml', 'yaml') // => false

For more information, or if you have issues or concerns, see type-is.有关更多信息,或者如果您有问题或疑虑,请参阅type-is

req.range(size[, options])

Range header parser.标头解析器。

The size parameter is the maximum size of the resource.size参数是资源的最大大小。

The options parameter is an object that can have the following properties.options参数是一个可以具有以下属性的对象。

Property属性 Type类型 Description描述
combine Boolean Specify if overlapping & adjacent ranges should be combined, defaults to false. When true, ranges will be combined and returned as if they were specified that way in the header.指定是否应组合重叠和相邻范围,默认为false。当为true时,范围将被组合并返回,就像它们在标头中以这种方式指定一样。

An array of ranges will be returned or negative numbers indicating an error parsing.将返回一个范围数组或负数,表示分析错误。

  • -2 signals a malformed header string发出格式错误的标头字符串的信号
  • -1 signals an unsatisfiable range表示范围不令人满意
// parse header from request
const range = req.range(1000)

// the type of the range
if (range.type === 'bytes') {
  // the ranges
  range.forEach((r) => {
    // do something with r.start and r.end
  })
}

Response

The res object represents the HTTP response that an Express app sends when it gets an HTTP request.res对象表示Express应用程序在收到HTTP请求时发送的HTTP响应。

In this documentation and by convention, the object is always referred to as res (and the HTTP request is req) but its actual name is determined by the parameters to the callback function in which you’re working.在本文档中,按照惯例,对象始终称为res(HTTP请求为req),但其实际名称由您正在使用的回调函数的参数决定。

For example:例如:

app.get('/user/:id', (req, res) => {
  res.send(`user ${req.params.id}`)
})

But you could just as well have:但你也可以:

app.get('/user/:id', (request, response) => {
  response.send(`user ${request.params.id}`)
})

The res object is an enhanced version of Node’s own response object and supports all built-in fields and methods.res对象是Node自己的响应对象的增强版本,支持所有内置字段和方法

Properties

res.app

This property holds a reference to the instance of the Express application that is using the middleware.此属性包含对使用中间件的Express应用程序实例的引用。

res.app is identical to the req.app property in the request object.res.app与请求对象中的res.app属性相同。

res.headersSent

Boolean property that indicates if the app sent HTTP headers for the response.布尔属性,指示应用程序是否为响应发送了HTTP标头。

app.get('/', (req, res) => {
  console.log(res.headersSent) // false
  res.send('OK')
  console.log(res.headersSent) // true
})

res.locals

Use this property to set variables accessible in templates rendered with res.render.使用此属性可以设置在使用res.render渲染的模板中可访问的变量。 The variables set on res.locals are available within a single request-response cycle, and will not be shared between requests.res.locals上设置的变量在单个请求-响应周期内可用,不会在请求之间共享。

The locals object is used by view engines to render a response. The object keys may be particularly sensitive and should not contain user-controlled input, as it may affect the operation of the view engine or provide a path to cross-site scripting. 视图引擎使用locals对象来呈现响应。对象键可能特别敏感,不应包含用户控制的输入,因为它可能会影响视图引擎的运行或提供跨站点脚本的路径。Consult the documentation for the used view engine for additional considerations.有关其他注意事项,请参阅所用视图引擎的文档。

In order to keep local variables for use in template rendering between requests, use app.locals instead.为了在请求之间保留用于模板呈现的局部变量,请改用app.locals

This property is useful for exposing request-level information such as the request path name, authenticated user, user settings, and so on to templates rendered within the application.此属性对于向应用程序中呈现的模板公开请求级信息(如请求路径名、经过身份验证的用户、用户设置等)非常有用。

app.use((req, res, next) => {
  // Make `user` and `authenticated` available in templates
  res.locals.user = req.user
  res.locals.authenticated = !req.user.anonymous
  next()
})

res.req

This property holds a reference to the request object that relates to this response object.此属性包含对与此响应对象相关的请求对象的引用。

Methods方法

res.append(field [, value])

res.append() is supported by Express v4.11.0+

Appends the specified value to the HTTP response header field. 将指定value附加到HTTP响应标头fieldIf the header is not already set, it creates the header with the specified value. The value parameter can be a string or an array.如果标题尚未设置,它将创建具有指定值的标题。value参数可以是字符串或数组。

Note

calling res.set() after res.append() will reset the previously-set header value.res.append()后调用res.set()将重置之前设置的标头值。

res.append('Link', ['<http://localhost/>', '<http://localhost:3000/>'])
res.append('Set-Cookie', 'foo=bar; Path=/; HttpOnly')
res.append('Warning', '199 Miscellaneous warning')

res.attachment([filename])

Sets the HTTP response Content-Disposition header field to “attachment”. 将HTTP响应Content-Disposition标头字段设置为“attachment”。If a filename is given, then it sets the Content-Type based on the extension name via res.type(), and sets the Content-Disposition “filename=” parameter.如果给定了filename,则它会通过res.type()根据扩展名设置Content-Type,并设置Content-Disposition“filename=”参数。

res.attachment()
// Content-Disposition: attachment

res.attachment('path/to/logo.png')
// Content-Disposition: attachment; filename="logo.png"
// Content-Type: image/png

res.cookie(name, value [, options])

Sets cookie name to value. The value parameter may be a string or object converted to JSON.将cookiename设置为valuevalue参数可以是转换为JSON的字符串或对象。

The options parameter is an object that can have the following properties.options参数是一个可以具有以下属性的对象。

Property属性 Type类型 Description描述
domain String Domain name for the cookie. Defaults to the domain name of the app.cookie的域名。默认为应用程序的域名。
encode Function A synchronous function used for cookie value encoding. Defaults to encodeURIComponent.用于cookie值编码的同步函数。默认为encodeURIComponent
expires Date Expiry date of the cookie in GMT. If not specified or set to 0, creates a session cookie.cookie在GMT中的到期日期。如果未指定或设置为0,则创建会话cookie。
httpOnly Boolean Flags the cookie to be accessible only by the web server.将cookie标记为仅可由web服务器访问。
maxAge Number Convenient option for setting the expiry time relative to the current time in milliseconds.方便的选项,用于设置相对于当前时间的到期时间(毫秒)。
path String Path for the cookie. Defaults to “/”.cookie的路径。默认为“/”。
partitioned Boolean Indicates that the cookie should be stored using partitioned storage. 表示cookie应使用分区存储进行存储。See Cookies Having Independent Partitioned State (CHIPS) for more details.有关更多详细信息,请参阅具有独立分区状态的Cookie(CHIPS)
priority String Value of the “Priority” Set-Cookie attribute.“优先级”Set-Cookie属性的值。
secure Boolean Marks the cookie to be used with HTTPS only.将cookie标记为仅与HTTPS一起使用。
signed Boolean Indicates if the cookie should be signed.指示是否应对cookie进行签名。
sameSite Boolean or String Value of the “SameSite” Set-Cookie attribute. More information at https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00#section-4.1.1.“SameSite”Set-Cookie属性的值。更多信息请访问https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00#section-4.1.1

All res.cookie() does is set the HTTP Set-Cookie header with the options provided.res.cookie()所做的就是使用提供的选项设置HTTP set Cookie标头。 Any option not specified defaults to the value stated in RFC 6265.任何未指定的选项默认为RFC 6265中规定的值。

For example:例如:

res.cookie('name', 'tobi', { domain: '.example.com', path: '/admin', secure: true })
res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true })

You can set multiple cookies in a single response by calling res.cookie multiple times, for example:您可以通过多次调用res.cookie在一个响应中设置多个Cookie,例如:

res
  .status(201)
  .cookie('access_token', `Bearer ${token}`, {
    expires: new Date(Date.now() + 8 * 3600000) // cookie will be removed after 8 hours
  })
  .cookie('test', 'test')
  .redirect(301, '/admin')

The encode option allows you to choose the function used for cookie value encoding. Does not support asynchronous functions.encode选项允许您选择用于cookie值编码的函数不支持异步函数。

Example use case: You need to set a domain-wide cookie for another site in your organization.示例用例:您需要为组织中的另一个站点设置一个域范围的cookie。 This other site (not under your administrative control) does not use URI-encoded cookie values.此其他网站(不受您的管理控制)不使用URI编码的cookie值。

// Default encoding
res.cookie('some_cross_domain_cookie', 'http://mysubdomain.example.com', { domain: 'example.com' })
// Result: 'some_cross_domain_cookie=http%3A%2F%2Fmysubdomain.example.com; Domain=example.com; Path=/'

// Custom encoding
res.cookie('some_cross_domain_cookie', 'http://mysubdomain.example.com', { domain: 'example.com', encode: String })
// Result: 'some_cross_domain_cookie=http://mysubdomain.example.com; Domain=example.com; Path=/;'

The maxAge option is a convenience option for setting “expires” relative to the current time in milliseconds. The following is equivalent to the second example above.maxAge选项是一个方便的选项,用于设置相对于当前时间(毫秒)的“过期”。以下与上述第二个示例等效。

res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true })

You can pass an object as the value parameter; it is then serialized as JSON and parsed by bodyParser() middleware.您可以将对象作为value参数传递;然后将其序列化为JSON,并由bodyPaser()中间件解析。

res.cookie('cart', { items: [1, 2, 3] })
res.cookie('cart', { items: [1, 2, 3] }, { maxAge: 900000 })

When using cookie-parser middleware, this method also supports signed cookies. 当使用cookie-parser中间件时,此方法也支持签名的cookie。Simply include the signed option set to true.只需将signed选项设置为true即可。 Then, res.cookie() will use the secret passed to cookieParser(secret) to sign the value.然后,res.cookie()将使用传递给cookieParser(secret)secret对值进行签名。

res.cookie('name', 'tobi', { signed: true })

Later, you may access this value through the req.signedCookies object.稍后,您可以通过req.signedCookies对象访问此值。

res.clearCookie(name [, options])

Clears the cookie with the specified name by sending a Set-Cookie header that sets its expiration date in the past.通过发送Set-Cookie标头来清除具有指定name的cookie,该标头设置了过去的过期日期。 This instructs the client that the cookie has expired and is no longer valid. 这指示客户端cookie已过期,不再有效。For more information about available options, see res.cookie().有关可用options的更多信息,请参阅res.cookie()

The expires and max-age options are being ignored completely.expiresmax-age选项将被完全忽略。

Web browsers and other compliant clients will only clear the cookie if the given options is identical to those given to res.cookie()Web浏览器和其他兼容客户端只有在给定的optionsres.cookie()的选项相同时才会清除cookie

res.cookie('name', 'tobi', { path: '/admin' })
res.clearCookie('name', { path: '/admin' })

res.download(path [, filename] [, options] [, fn])

The optional options argument is supported by Express v4.16.0 onwards.Express v4.16.0及以后版本支持可选options参数。

Transfers the file at path as an “attachment”. Typically, browsers will prompt the user for download.path中的文件作为“附件”传输。通常,浏览器会提示用户下载。 By default, the Content-Disposition header “filename=” parameter is derived from the path argument, but can be overridden with the filename parameter.默认情况下,Content-Disposition标头“filename=”参数从path参数派生,但可以用filename参数覆盖。 If path is relative, then it will be based on the current working directory of the process or the root option, if provided.如果path是相对的,那么它将基于进程的当前工作目录或root选项(如果提供)。

This API provides access to data on the running file system. 此API提供对正在运行的文件系统上的数据的访问。Ensure that either (a) the way in which the path argument was constructed is secure if it contains user input or (b) set the root option to the absolute path of a directory to contain access within.确保(a)如果path参数包含用户输入,则其构造方式是安全的,或者(b)将root选项设置为包含访问权限的目录的绝对路径。

When the root option is provided, Express will validate that the relative path provided as path will resolve within the given root option.当提供root选项时,Express将验证作为path提供的相对路径是否会在给定的root选项内解析。

The following table provides details on the options parameter.下表提供了options参数的详细信息。

The optional options argument is supported by Express v4.16.0 onwards.Express v4.16.0及以后版本支持可选options参数。

Property属性 Description描述 Default默认值 Availability可用性
maxAge Sets the max-age property of the Cache-Control header in milliseconds or a string in ms format设置Cache-Control标头的最大年龄属性(以毫秒为单位)或ms格式的字符串 0 4.16+
root Root directory for relative filenames.相对文件名的根目录。   4.18+
lastModified Sets the Last-Modified header to the last modified date of the file on the OS. Set false to disable it.Last-Modified标头设置为操作系统上文件的最后修改日期。设置false以禁用它。 Enabled 4.16+
headers Object containing HTTP headers to serve with the file. The header Content-Disposition will be overridden by the filename argument.包含与文件一起使用的HTTP标头的对象。标头Content-Disposition将被filename参数覆盖。   4.16+
dotfiles Option for serving dotfiles. Possible values are “allow”, “deny”, “ignore”.提供点文件的选项。可能的值是“允许”、“拒绝”、“忽略”。 “ignore” 4.16+
acceptRanges Enable or disable accepting ranged requests.启用或禁用接受范围请求。 true 4.16+
cacheControl Enable or disable setting Cache-Control response header.启用或禁用设置Cache-Control响应标头。 true 4.16+
immutable Enable or disable the immutable directive in the Cache-Control response header. If enabled, the maxAge option should also be specified to enable caching. 启用或禁用Cache-Control响应标头中的immutable指令。如果启用,还应指定maxAge选项以启用缓存。The immutable directive will prevent supported clients from making conditional requests during the life of the maxAge option to check if the file has changed.immutable指令将阻止受支持的客户端在maxAge选项的生命周期内发出条件请求,以检查文件是否已更改。 false 4.16+

The method invokes the callback function fn(err) when the transfer is complete or when an error occurs. 当传输完成或发生错误时,该方法调用回调函数fn(err)If the callback function is specified and an error occurs, the callback function must explicitly handle the response process either by ending the request-response cycle, or by passing control to the next route.如果指定了回调函数并发生错误,则回调函数必须通过结束请求-响应周期或将控制传递给下一个路由来显式处理响应过程。

res.download('/report-12345.pdf')

res.download('/report-12345.pdf', 'report.pdf')

res.download('/report-12345.pdf', 'report.pdf', (err) => {
  if (err) {
    // Handle error, but keep in mind the response may be partially-sent
    // so check res.headersSent
  } else {
    // decrement a download credit, etc.
  }
})

res.end([data[, encoding]][, callback])

Ends the response process. This method actually comes from Node core, specifically the response.end() method of http.ServerResponse.结束响应过程。此方法实际上来自Node核心,特别是http.ServerResponseresponse.end()方法

Use to quickly end the response without any data. If you need to respond with data, instead use methods such as res.send() and res.json().用于在没有任何数据的情况下快速结束响应。如果需要用数据进行响应,请使用res.send()res.json()等方法。

res.end()
res.status(404).end()

res.format(object)

Performs content-negotiation on the Accept HTTP header on the request object, when present.对请求对象上的Accept HTTP标头(如果存在)执行内容协商。 It uses req.accepts() to select a handler for the request, based on the acceptable types ordered by their quality values. 它使用req.accepts()根据可接受类型的质量值顺序为请求选择处理程序。If the header is not specified, the first callback is invoked. When no match is found, the server responds with 406 “Not Acceptable”, or invokes the default callback.如果未指定标头,则调用第一个回调。如果找不到匹配项,服务器将返回406 “not Acceptable”,或调用default回调。

The Content-Type response header is set when a callback is selected. 当选择回调时,会设置Content-Type响应标头。However, you may alter this within the callback using methods such as res.set() or res.type().但是,您可以使用res.set()res.type()等方法在回调中更改此设置。

The following example would respond with { "message": "hey" } when the Accept header field is set to “application/json” or “*/json” (however, if it is “*/*”, then the response will be “hey”).Accept标头字段设置为“application/json”或“*/json”时,以下示例将返回{ "message": "hey" }(但是,如果它是“*/*”,则响应将是“hey“)。

res.format({
  'text/plain' () {
    res.send('hey')
  },

  'text/html' () {
    res.send('<p>hey</p>')
  },

  'application/json' () {
    res.send({ message: 'hey' })
  },

  default () {
    // log the request and respond with 406
    res.status(406).send('Not Acceptable')
  }
})

In addition to canonicalized MIME types, you may also use extension names mapped to these types for a slightly less verbose implementation:除了规范化的MIME类型外,您还可以使用映射到这些类型的扩展名来实现稍微不那么冗长的实现:

res.format({
  text () {
    res.send('hey')
  },

  html () {
    res.send('<p>hey</p>')
  },

  json () {
    res.send({ message: 'hey' })
  }
})

res.get(field)

Returns the HTTP response header specified by field. The match is case-insensitive.返回由field指定的HTTP响应标头。匹配不区分大小写。

res.get('Content-Type')
// => "text/plain"

res.json([body])

Sends a JSON response. This method sends a response (with the correct content-type) that is the parameter converted to a JSON string using JSON.stringify().发送JSON响应。此方法发送一个响应(具有正确的内容类型),该响应是使用JSON.stringify()转换为JSON字符串的参数。

The parameter can be any JSON type, including object, array, string, Boolean, number, or null, and you can also use it to convert other values to JSON.参数可以是任何JSON类型,包括对象、数组、字符串、布尔值、数字或null,您还可以使用它将其他值转换为JSON。

res.json(null)
res.json({ user: 'tobi' })
res.status(500).json({ error: 'message' })

res.jsonp([body])

Sends a JSON response with JSONP support. This method is identical to res.json(), except that it opts-in to JSONP callback support.发送支持JSONP的JSON响应。此方法与res.json()完全相同,只是它选择了JSONP回调支持。

res.jsonp(null)
// => callback(null)

res.jsonp({ user: 'tobi' })
// => callback({ "user": "tobi" })

res.status(500).jsonp({ error: 'message' })
// => callback({ "error": "message" })

By default, the JSONP callback name is simply callback. Override this with the jsonp callback name setting.默认情况下,JSONP回调名称只是callback。用jsonp回调名称设置覆盖此设置。

The following are some examples of JSONP responses using the same code:以下是使用相同代码的JSONP响应的一些示例:

// ?callback=foo
res.jsonp({ user: 'tobi' })
// => foo({ "user": "tobi" })

app.set('jsonp callback name', 'cb')

// ?cb=foo
res.status(500).jsonp({ error: 'message' })
// => foo({ "error": "message" })

Joins the links provided as properties of the parameter to populate the response’s Link HTTP header field.连接作为参数属性提供的links,以填充响应的Link HTTP标头字段。

For example, the following call:例如,以下调用:

res.links({
  next: 'http://api.example.com/users?page=2',
  last: 'http://api.example.com/users?page=5'
})

Yields the following results:产生以下结果:

Link: <http://api.example.com/users?page=2>; rel="next",
      <http://api.example.com/users?page=5>; rel="last"

res.location(path)

Sets the response Location HTTP header to the specified path parameter.将响应Location HTTP标头设置为指定的路径参数。

res.location('/foo/bar')
res.location('http://example.com')

After encoding the URL, if not encoded already, Express passes the specified URL to the browser in the Location header, without any validation.对URL进行编码后(如果尚未编码),Express会在Location标头中将指定的URL传递给浏览器,而不进行任何验证。

Browsers take the responsibility of deriving the intended URL from the current URL or the referring URL, and the URL specified in the Location header; and redirect the user accordingly.浏览器负责从当前URL、引用URL和Location标头中指定的URL中导出预期的URL;并相应地重定向用户。

res.redirect([status,] path)

Redirects to the URL derived from the specified path, with specified status, a positive integer that corresponds to an HTTP status code.重定向到从指定path导出的URL,具有指定的status,一个与HTTP状态代码对应的正整数。 If not specified, status defaults to 302 "Found".如果未指定,status默认为302 "Found"

res.redirect('/foo/bar')
res.redirect('http://example.com')
res.redirect(301, 'http://example.com')
res.redirect('../login')

Redirects can be a fully-qualified URL for redirecting to a different site:重定向可以是一个完全限定的URL,用于重定向到其他网站:

res.redirect('http://google.com')

Redirects can be relative to the root of the host name. 重定向可以相对于主机名的根。For example, if the application is on http://example.com/admin/post/new, the following would redirect to the URL http://example.com/admin:例如,如果应用程序处于打开状态http://example.com/admin/post/new,以下内容将重定向到URLhttp://example.com/admin

res.redirect('/admin')

Redirects can be relative to the current URL. 重定向可以相对于当前URL。For example, from http://example.com/blog/admin/ (notice the trailing slash), the following would redirect to the URL http://example.com/blog/admin/post/new.例如,从http://example.com/blog/admin/(注意后面的斜线),以下内容将重定向到URLhttp://example.com/blog/admin/post/new

res.redirect('post/new')

Redirecting to post/new from http://example.com/blog/admin (no trailing slash), will redirect to http://example.com/blog/post/new.重定向从http://examplecom/blog/admin(无尾随斜线)到post/new,即将重定向到http://example.com/blog/post/new

If you found the above behavior confusing, think of path segments as directories (with trailing slashes) and files, it will start to make sense.如果您发现上述行为令人困惑,请将路径段视为目录(带有尾随斜线)和文件,这将开始有意义。

Path-relative redirects are also possible. 路径相对重定向也是可能的。If you were on http://example.com/admin/post/new, the following would redirect to http://example.com/admin/post:如果你在http://example.com/admin/post/new,以下内容将重定向到http://example.com/admin/post

res.redirect('..')

See also Security best practices: Prevent open redirect vulnerabilities.另请参阅安全最佳实践:防止开放重定向漏洞

res.render(view [, locals] [, callback])

Renders a view and sends the rendered HTML string to the client. Optional parameters:渲染view并将渲染的HTML字符串发送到客户端可选参数:

  • locals, an object whose properties define local variables for the view.,其属性定义视图局部变量的对象。
  • callback, a callback function. If provided, the method returns both the possible error and rendered string, but does not perform an automated response. callback,一个回调函数。如果提供,该方法将返回可能的错误和呈现的字符串,但不执行自动响应。When an error occurs, the method invokes next(err) internally.当发生错误时,该方法在内部调用next(err)

The view argument is a string that is the file path of the view file to render. view参数是一个字符串,是要渲染的视图文件的文件路径。This can be an absolute path, or a path relative to the views setting. 这可以是绝对路径,也可以是相对于views设置的路径。If the path does not contain a file extension, then the view engine setting determines the file extension. 如果路径不包含文件扩展名,则view engine设置将确定文件扩展名。If the path does contain a file extension, then Express will load the module for the specified template engine (via require()) and render it using the loaded module’s __express function.如果路径确实包含文件扩展名,则Express将为指定的模板引擎加载模块(通过require()),并使用加载的模块的__express函数进行渲染。

For more information, see Using template engines with Express.有关更多信息,请参阅在Express中使用模板引擎

Warning警告

The view argument performs file system operations like reading a file from disk and evaluating Node.js modules, and as so for security reasons should not contain input from the end-user.view参数执行文件系统操作,如从磁盘读取文件和评估Node.js模块,因此出于安全原因,不应包含来自最终用户的输入。

Warning警告

The locals object is used by view engines to render a response. The object keys may be particularly sensitive and should not contain user-controlled input, as it may affect the operation of the view engine or provide a path to cross-site scripting. 视图引擎使用locals对象来呈现响应。对象键可能特别敏感,不应包含用户控制的输入,因为它可能会影响视图引擎的运行或提供跨站点脚本的路径。Consult the documentation for the used view engine for additional considerations.有关其他注意事项,请参阅所用视图引擎的文档。

Caution小心

The local variable cache enables view caching. Set it to true, to cache the view during development; view caching is enabled in production by default.局部变量cache启用视图缓存。将其设置为true,以便在开发过程中缓存视图;默认情况下,视图缓存在生产环境中启用。

// send the rendered view to the client
res.render('index')

// if a callback is specified, the rendered HTML string has to be sent explicitly如果指定了回调,则必须显式发送呈现的HTML字符串
res.render('index', (err, html) => {
  res.send(html)
})

// pass a local variable to the view将局部变量传递给视图
res.render('user', { name: 'Tobi' }, (err, html) => {
  // ...
})

res.send([body])

Sends the HTTP response.发送HTTP响应。

The body parameter can be a Buffer object, a String, an object, Boolean, or an Array. For example:body参数可以是Buffer对象、String、对象、BooleanArray。例如:

res.send(Buffer.from('whoop'))
res.send({ some: 'json' })
res.send('<p>some html</p>')
res.status(404).send('Sorry, we cannot find that!')
res.status(500).send({ error: 'something blew up' })

This method performs many useful tasks for simple non-streaming responses: For example, it automatically assigns the Content-Length HTTP response header field and provides automatic HEAD and HTTP cache freshness support.此方法对简单的非流式响应执行许多有用的任务:例如,它自动分配Content-Length HTTP响应头字段,并提供自动HEAD和HTTP缓存新鲜度支持。

When the parameter is a Buffer object, the method sets the Content-Type response header field to “application/octet-stream”, unless previously defined as shown below:当参数是Buffer对象时,该方法将Content-Type响应头字段设置为“应用程序/八位字节流”,除非之前定义如下:

res.set('Content-Type', 'text/html')
res.send(Buffer.from('<p>some html</p>'))

When the parameter is a String, the method sets the Content-Type to “text/html”:当参数为String时,该方法将Content-Type设置为“text/html”:

res.send('<p>some html</p>')

When the parameter is an Array or Object, Express responds with the JSON representation:当参数是ArrayObject时,Express会以JSON表示进行响应:

res.send({ user: 'tobi' })
res.send([1, 2, 3])

res.sendFile(path [, options] [, fn])

res.sendFile() is supported by Express v4.8.0 onwards.受Express v4.8.0及更高版本的支持。

Transfers the file at the given path. 按给定path传输文件。Sets the Content-Type response HTTP header field based on the filename’s extension. 根据文件扩展名设置Content-Type响应HTTP标头字段。Unless the root option is set in the options object, path must be an absolute path to the file.除非在options对象中设置了root选项,否则path必须是文件的绝对路径。

This API provides access to data on the running file system. 此API提供对正在运行的文件系统上的数据的访问。Ensure that either (a) the way in which the path argument was constructed into an absolute path is secure if it contains user input or (b) set the root option to the absolute path of a directory to contain access within.确保(a)如果path参数包含用户输入,则将其构造为绝对路径的方式是安全的,或者(b)将root选项设置为包含访问权限的目录的绝对路径。

When the root option is provided, the path argument is allowed to be a relative path, including containing ... 当提供root选项时,允许path参数是相对路径,包括包含..Express will validate that the relative path provided as path will resolve within the given root option.Express将验证作为path提供的相对路径是否会在给定的root选项内解析。

The following table provides details on the options parameter.下表提供了options参数的详细信息。

Property属性 Description描述 Default默认值 Availability
maxAge Sets the max-age property of the Cache-Control header in milliseconds or a string in ms format设置Cache-Control标头的最大年龄属性(以毫秒为单位)或ms格式的字符串 0  
root Root directory for relative filenames.相对文件名的根目录。    
lastModified Sets the Last-Modified header to the last modified date of the file on the OS. Set false to disable it.Last-Modified标头设置为操作系统上文件的最后修改日期。设置false以禁用它。 Enabled 4.9.0+
headers Object containing HTTP headers to serve with the file.包含与文件一起使用的HTTP标头的对象。    
dotfiles Option for serving dotfiles. Possible values are “allow”, “deny”, “ignore”.提供点文件的选项。可能的值是“允许”、“拒绝”、“忽略”。 “ignore”  
acceptRanges Enable or disable accepting ranged requests.启用或禁用接受范围请求。 true 4.14+
cacheControl Enable or disable setting Cache-Control response header.启用或禁用设置Cache-Control响应标头。 true 4.14+
immutable Enable or disable the immutable directive in the Cache-Control response header. If enabled, the maxAge option should also be specified to enable caching. 启用或禁用Cache-Control响应标头中的immutable指令。如果启用,还应指定maxAge选项以启用缓存。The immutable directive will prevent supported clients from making conditional requests during the life of the maxAge option to check if the file has changed.immutable指令将阻止受支持的客户端在maxAge选项的生命周期内发出条件请求,以检查文件是否已更改。 false 4.16+

The method invokes the callback function fn(err) when the transfer is complete or when an error occurs. 当传输完成或发生错误时,该方法调用回调函数fn(err)If the callback function is specified and an error occurs, the callback function must explicitly handle the response process either by ending the request-response cycle, or by passing control to the next route.如果指定了回调函数并发生错误,则回调函数必须通过结束请求-响应周期或将控制传递给下一个路由来显式处理响应过程。

Here is an example of using res.sendFile with all its arguments.下面是一个使用res.sendFile及其所有参数的示例。

app.get('/file/:name', (req, res, next) => {
  const options = {
    root: path.join(__dirname, 'public'),
    dotfiles: 'deny',
    headers: {
      'x-timestamp': Date.now(),
      'x-sent': true
    }
  }

  const fileName = req.params.name
  res.sendFile(fileName, options, (err) => {
    if (err) {
      next(err)
    } else {
      console.log('Sent:', fileName)
    }
  })
})

The following example illustrates using res.sendFile to provide fine-grained support for serving files:以下示例说明了如何使用res.sendFile为服务文件提供细粒度支持:

app.get('/user/:uid/photos/:file', (req, res) => {
  const uid = req.params.uid
  const file = req.params.file

  req.user.mayViewFilesFrom(uid, (yes) => {
    if (yes) {
      res.sendFile(`/uploads/${uid}/${file}`)
    } else {
      res.status(403).send("Sorry! You can't see that.")
    }
  })
})

For more information, or if you have issues or concerns, see send.有关更多信息,或者如果您有问题或疑虑,请参阅send

res.sendStatus(statusCode)

Sets the response HTTP status code to statusCode and sends the registered status message as the text response body. If an unknown status code is specified, the response body will just be the code number.将响应HTTP状态代码设置为statusCode,并将注册的状态消息作为文本响应正文发送。如果指定了未知的状态代码,则响应体将只是代码编号。

res.sendStatus(404)

Some versions of Node.js will throw when res.statusCode is set to an invalid HTTP status code (outside of the range 100 to 599). res.statusCode设置为无效的HTTP状态码(在100599的范围之外)时,Node.js的某些版本会抛出。Consult the HTTP server documentation for the Node.js version being used.有关正在使用的Node.js版本,请参阅HTTP服务器文档。

More about HTTP Status Codes有关HTTP状态代码的更多信息

res.set(field [, value])

Sets the response’s HTTP header field to value. To set multiple fields at once, pass an object as the parameter.将响应的HTTP标头field设置为value若要一次设置多个字段,请传递一个对象作为参数。

res.set('Content-Type', 'text/plain')

res.set({
  'Content-Type': 'text/plain',
  'Content-Length': '123',
  ETag: '12345'
})

Aliased as res.header(field [, value]).别名为res.header(field [, value])

res.status(code)

Sets the HTTP status for the response. It is a chainable alias of Node’s response.statusCode.设置response的HTTP状态。它是Node的response.statusCode的可链接别名。

res.status(403).end()
res.status(400).send('Bad Request')
res.status(404).sendFile('/absolute/path/to/404.png')

res.type(type)

Sets the Content-Type HTTP header to the MIME type as determined by the specified type. Content-Type HTTP标头设置为由指定type确定的MIME类型。If type contains the “/” character, then it sets the Content-Type to the exact value of type, otherwise it is assumed to be a file extension and the MIME type is looked up using the contentType() method of the mime-types package.如果type包含“/”字符,则它将Content-Type设置为type的确切值,否则它将被假定为文件扩展名,并使用mime-types包的contentType()方法查找MIME类型。

res.type('.html') // => 'text/html'
res.type('html') // => 'text/html'
res.type('json') // => 'application/json'
res.type('application/json') // => 'application/json'
res.type('png') // => image/png:

Aliased as res.contentType(type).别名为res.contentType(type)

res.vary(field)

Adds the field to the Vary response header, if it is not there already.如果该字段尚未存在,则将其添加到Vary响应标头中。

res.vary('User-Agent').render('docs')

Router

A router object is an instance of middleware and routes. You can think of it as a “mini-application,” capable only of performing middleware and routing functions. router对象是中间件和路由的实例。你可以把它看作是一个“迷你应用程序”,只能执行中间件和路由功能。Every Express application has a built-in app router.每个Express应用程序都有一个内置的应用程序路由器。

A router behaves like middleware itself, so you can use it as an argument to app.use() or as the argument to another router’s use() method.路由器的行为类似于中间件本身,因此您可以将其用作app.use()的参数或另一个路由器use()方法的参数。

The top-level express object has a Router() method that creates a new router object.顶级express对象有一个Router()方法,用于创建新的router对象。

Once you’ve created a router object, you can add middleware and HTTP method routes (such as get, put, post, and so on) to it just like an application. For example:创建路由器对象后,您可以像应用程序一样向其添加中间件和HTTP方法路由(如getputpost等)。例如:

// invoked for any requests passed to this router
router.use((req, res, next) => {
  // .. some logic here .. like any other middleware
  next()
})

// will handle any request that ends in /events
// depends on where the router is "use()'d"
router.get('/events', (req, res, next) => {
  // ..
})

You can then use a router for a particular root URL in this way separating your routes into files or even mini-apps.然后,您可以将路由器用于特定的根URL,从而将路由分离到文件甚至迷你应用程序中。

// only requests to /calendar/* will be sent to our "router"
app.use('/calendar', router)

Keep in mind that any middleware applied to a router will run for all requests on that router’s path, even those that aren’t part of the router.请记住,应用于路由器的任何中间件都将为该路由器路径上的所有请求运行,即使是那些不属于路由器的请求。

Methods方法

router.all(path, [callback, ...] callback)

This method is just like the router.METHOD() methods, except that it matches all HTTP methods (verbs).此方法与router.METHOD()方法类似,只是它匹配所有HTTP方法(动词)。

This method is extremely useful for mapping “global” logic for specific path prefixes or arbitrary matches.此方法对于为特定路径前缀或任意匹配映射“全局”逻辑非常有用。 For example, if you placed the following route at the top of all other route definitions, it would require that all routes from that point on would require authentication, and automatically load a user. 例如,如果将以下路由放置在所有其他路由定义的顶部,则要求从该点开始的所有路由都需要身份验证,并自动加载用户。Keep in mind that these callbacks do not have to act as end points; loadUser can perform a task, then call next() to continue matching subsequent routes.请记住,这些回调不必充当端点;loadUser可以执行一个任务,然后调用next()继续匹配后续路由。

router.all('{*splat}', requireAuthentication, loadUser)

Or the equivalent:或等效物:

router.all('{*splat}', requireAuthentication)
router.all('{*splat}', loadUser)

Another example of this is white-listed “global” functionality. Here, the example is much like before, but it only restricts paths prefixed with “/api”:另一个例子是白名单上的“全局”功能。这里的示例与之前非常相似,但它只限制前缀为“/api”的路径:

router.all('/api/{*splat}', requireAuthentication)

router.METHOD(path, [callback, ...] callback)

The router.METHOD() methods provide the routing functionality in Express, where METHOD is one of the HTTP methods, such as GET, PUT, POST, and so on, in lowercase. router.METHOD()方法在Express中提供路由功能,其中METHOD是HTTP方法之一,如GET、PUT、POST等,小写。Thus, the actual methods are router.get(), router.post(), router.put(), and so on.因此,实际的方法是router.get()route.post()router.put()等。

The router.get() function is automatically called for the HTTP HEAD method in addition to the GET method if router.head() was not called for the path before router.get().如果在router.get()之前没有对路径调用router.head(),则除了GET方法外,HTTP HEAD方法也会自动调用router.get()函数。

You can provide multiple callbacks, and all are treated equally, and behave just like middleware, except that these callbacks may invoke next('route') to bypass the remaining route callback(s). 您可以提供多个回调,所有回调都被同等对待,并且行为就像中间件一样,除了这些回调可能会调用next('route')来绕过其余的路由回调。You can use this mechanism to perform pre-conditions on a route then pass control to subsequent routes when there is no reason to proceed with the route matched.您可以使用此机制对路线执行条件,然后在没有理由继续匹配路线时将控制权传递给后续路线。

The following snippet illustrates the most simple route definition possible.以下代码段说明了最简单的路由定义。 Express translates the path strings to regular expressions, used internally to match incoming requests. Express将路径字符串转换为正则表达式,在内部用于匹配传入请求。Query strings are not considered when performing these matches, for example “GET /” would match the following route, as would “GET /?name=tobi”.执行这些匹配时不考虑查询字符串,例如“GET/”将匹配以下路由,“GET/?name=tobi”也是如此。

router.get('/', (req, res) => {
  res.send('hello world')
})

You can also use regular expressions—useful if you have very specific constraints, for example the following would match “GET /commits/71dbb9c” as well as “GET /commits/71dbb9c..4c084f9”.您还可以使用正则表达式——如果您有非常具体的约束,则很有用,例如以下表达式将匹配“GET /commits/71dbb9c”以及“GET /cocommits/71dbbjc..4c084f9”。

router.get(/^\/commits\/(\w+)(?:\.\.(\w+))?$/, (req, res) => {
  const from = req.params[0]
  const to = req.params[1] || 'HEAD'
  res.send(`commit range ${from}..${to}`)
})

You can use next primitive to implement a flow control between different middleware functions, based on a specific program state. 您可以使用next原语根据特定的程序状态在不同的中间件功能之间实现流控制。Invoking next with the string 'router' will cause all the remaining route callbacks on that router to be bypassed.使用字符串'router'调用next将导致绕过该路由器上所有剩余的路由回调。

The following example illustrates next('router') usage.以下示例说明了next('router')用法。

function fn (req, res, next) {
  console.log('I come here')
  next('router')
}
router.get('/foo', fn, (req, res, next) => {
  console.log('I dont come here')
})
router.get('/foo', (req, res, next) => {
  console.log('I dont come here')
})
app.get('/foo', (req, res) => {
  console.log(' I come here too')
  res.end('good')
})

router.param(name, callback)

Adds callback triggers to route parameters, where name is the name of the parameter and callback is the callback function. Although name is technically optional, using this method without it is deprecated starting with Express v4.11.0 (see below).向路由参数添加回调触发器,其中name是参数的名称,callback是回调函数。虽然name在技术上是可选的,但从Express v4.11.0开始,不推荐使用此方法(见下文)。

The parameters of the callback function are:回调函数的参数如下:

  • req, the request object.,请求对象。
  • res, the response object.,响应对象。
  • next, indicating the next middleware function.,指示下一个中间件功能。
  • The value of the name parameter.name参数的值。
  • The name of the parameter.参数的名称。

Unlike app.param(), router.param() does not accept an array of route parameters.app.param()不同,router.param()不接受路由参数数组。

For example, when :user is present in a route path, you may map user loading logic to automatically provide req.user to the route, or perform validations on the parameter input.例如,当:user出现在路由路径中时,您可以映射用户加载逻辑以自动向路由提供req.user,或对参数输入进行验证。

router.param('user', (req, res, next, id) => {
  // try to get the user details from the User model and attach it to the request object
  User.find(id, (err, user) => {
    if (err) {
      next(err)
    } else if (user) {
      req.user = user
      next()
    } else {
      next(new Error('failed to load user'))
    }
  })
})

Param callback functions are local to the router on which they are defined. They are not inherited by mounted apps or routers, nor are they triggered for route parameters inherited from parent routers. 参数回调函数是定义它们的路由器的本地函数。它们不会被挂载的应用程序或路由器继承,也不会因从父路由器继承的路由参数而触发。Hence, param callbacks defined on router will be triggered only by route parameters defined on router routes.因此,在路由器上定义的参数回调将仅由在路由器路由上定义的router参数触发。

A param callback will be called only once in a request-response cycle, even if the parameter is matched in multiple routes, as shown in the following examples.即使参数在多个路由中匹配,参数回调在请求-响应周期中也只会被调用一次,如以下示例所示。

router.param('id', (req, res, next, id) => {
  console.log('CALLED ONLY ONCE')
  next()
})

router.get('/user/:id', (req, res, next) => {
  console.log('although this matches')
  next()
})

router.get('/user/:id', (req, res) => {
  console.log('and this matches too')
  res.end()
})

On GET /user/42, the following is printed:GET /user/42上打印以下内容:

CALLED ONLY ONCE
although this matches
and this matches too

router.route(path)

Returns an instance of a single route which you can then use to handle HTTP verbs with optional middleware. 返回单个路由的实例,然后您可以使用该实例通过可选中间件处理HTTP verbs。Use router.route() to avoid duplicate route naming and thus typing errors.使用router.route()来避免重复的路由命名和其他类型错误。

Building on the router.param() example above, the following code shows how to use router.route() to specify various HTTP method handlers.基于上面的router.param()示例,以下代码显示了如何使用router.route()指定各种HTTP方法处理程序。

const router = express.Router()

router.param('user_id', (req, res, next, id) => {
  // sample user, would actually fetch from DB, etc...
  req.user = {
    id,
    name: 'TJ'
  }
  next()
})

router.route('/users/:user_id')
  .all((req, res, next) => {
  // runs for all HTTP verbs first
  // think of it as route specific middleware!
    next()
  })
  .get((req, res, next) => {
    res.json(req.user)
  })
  .put((req, res, next) => {
  // just an example of maybe updating the user
    req.user.name = req.params.name
    // save user ... etc
    res.json(req.user)
  })
  .post((req, res, next) => {
    next(new Error('not implemented'))
  })
  .delete((req, res, next) => {
    next(new Error('not implemented'))
  })

This approach re-uses the single /users/:user_id path and adds handlers for various HTTP methods.这种方法重用了sing/users/:user_id路径,并为各种HTTP方法添加了处理程序。

Note备注

When you use router.route(), middleware ordering is based on when the route is created, not when method handlers are added to the route. For this purpose, you can consider method handlers to belong to the route to which they were added.当您使用router.route()时,中间件排序基于创建路由的时间,而不是将方法处理程序添加到路由的时间。为此,您可以将方法处理程序视为属于添加它们的路由。

router.use([path], [function, ...] function)

Uses the specified middleware function or functions, with optional mount path path, that defaults to “/”.使用指定的一个或多个中间件函数,带有默认为“/”的可选装载路径path

This method is similar to app.use(). A simple example and use case is described below.此方法类似于app.use()。下面描述了一个简单的示例和用例。 See app.use() for more information.有关更多信息,请参阅app.use()

Middleware is like a plumbing pipe: requests start at the first middleware function defined and work their way “down” the middleware stack processing for each path they match.中间件就像一个管道:请求从定义的第一个中间件函数开始,沿着中间件堆栈“向下”处理它们匹配的每条路径。

const express = require('express')
const app = express()
const router = express.Router()

// simple logger for this router's requests此路由器请求的简单记录器
// all requests to this router will first hit this middleware所有对此路由器的请求都将首先到达此中间件
router.use((req, res, next) => {
  console.log('%s %s %s', req.method, req.url, req.path)
  next()
})

// this will only be invoked if the path starts with /bar from the mount point只有当路径从装载点开始以/bar开头时,才会调用此选项
router.use('/bar', (req, res, next) => {
  // ... maybe some additional /bar logging ...
  next()
})

// always invoked
router.use((req, res, next) => {
  res.send('Hello World')
})

app.use('/foo', router)

app.listen(3000)

The “mount” path is stripped and is not visible to the middleware function.“挂载”路径被剥离,中间件功能不可见。 The main effect of this feature is that a mounted middleware function may operate without code changes regardless of its “prefix” pathname.此功能的主要效果是,安装的中间件函数可以在不更改代码的情况下运行,而不管其“前缀”路径名如何。

The order in which you define middleware with router.use() is very important.使用router.use()定义中间件的顺序非常重要。 They are invoked sequentially, thus the order defines middleware precedence. For example, usually a logger is the very first middleware you would use, so that every request gets logged.它们是按顺序调用的,因此顺序定义了中间件的优先级。例如,通常记录器是您使用的第一个中间件,这样每个请求都会被记录下来。

const logger = require('morgan')

router.use(logger())
router.use(express.static(path.join(__dirname, 'public')))
router.use((req, res) => {
  res.send('Hello')
})

Now suppose you wanted to ignore logging requests for static files, but to continue logging routes and middleware defined after logger(). 现在假设您想忽略静态文件的日志记录请求,但要继续记录logger()后定义的路由和中间件。You would simply move the call to express.static() to the top, before adding the logger middleware:在添加记录器中间件之前,您只需将express.static()的调用移到顶部:

router.use(express.static(path.join(__dirname, 'public')))
router.use(logger())
router.use((req, res) => {
  res.send('Hello')
})

Another example is serving files from multiple directories, giving precedence to “./public” over the others:另一个例子是提供来自多个目录的文件,使“./public”优先于其他目录:

app.use(express.static(path.join(__dirname, 'public')))
app.use(express.static(path.join(__dirname, 'files')))
app.use(express.static(path.join(__dirname, 'uploads')))

The router.use() method also supports named parameters so that your mount points for other routers can benefit from preloading using named parameters.router.use()方法还支持命名参数,这样其他路由器的挂载点就可以从使用命名参数的预加载中受益。

NOTE: Although these middleware functions are added via a particular router, when they run is defined by the path they are attached to (not the router). :虽然这些中间件功能是通过特定的路由器添加的,但它们运行的时间是由它们所连接的路径(而不是路由器)定义的。Therefore, middleware added via one router may run for other routers if its routes match. For example, this code shows two different routers mounted on the same path:因此,如果路由匹配,通过一个路由器添加的中间件可以为其他路由器运行。例如,此代码显示安装在同一路径上的两个不同路由器:

const authRouter = express.Router()
const openRouter = express.Router()

authRouter.use(require('./authenticate').basic(usersdb))

authRouter.get('/:user_id/edit', (req, res, next) => {
  // ... Edit user UI ...
})
openRouter.get('/', (req, res, next) => {
  // ... List users ...
})
openRouter.get('/:user_id', (req, res, next) => {
  // ... View user ...
})

app.use('/users', authRouter)
app.use('/users', openRouter)

Even though the authentication middleware was added via the authRouter it will run on the routes defined by the openRouter as well since both routers were mounted on /users. 即使身份验证中间件是通过authRouter添加的,它也会在openRouter定义的路由上运行,因为这两个路由器都安装在/users上。To avoid this behavior, use different paths for each router.为了避免这种行为,请为每个路由器使用不同的路径。