请求
处理函数的第一个参数是 Request
。
Request 是 Fastify 的核心对象,包含以下字段:
query
- 解析后的查询字符串,其格式由querystringParser
指定。body
- 请求负载,有关 Fastify 原生解析的请求负载和如何支持其他内容类型的详细信息,请参阅 Content-Type Parser。params
- 与 URL 匹配的参数。headers
- 头部获取器和设置器。raw
- 来自 Node 核心的传入 HTTP 请求。server
- 当前 封装上下文 中的 Fastify 服务器实例。id
- 请求 ID。log
- 入站请求的日志实例。ip
- 入站请求的 IP 地址。ips
- 按从最近到最远排序的入站请求中的 IP 地址数组(仅在启用trustProxy
选项时有效)。host
- 入站请求的主机名(当启用trustProxy
选项时,从X-Forwarded-Host
头派生)。为了与 HTTP/2 兼容,在没有主机头的情况下返回:authority
。如果requireHostHeader
设置为false
、未提供 HTTP/1.0 或被模式验证移除,则主机头可能为空字符串。hostname
- 从入站请求的host
属性派生的主机名。port
- 来自host
属性的端口,这可能是服务器监听的端口。protocol
- 入站请求的协议(https
或http
)。method
- 入站请求的方法。url
- 入站请求的 URL。originalUrl
- 类似于url
,允许在内部重定向时访问原始url
。is404
- 如果请求由 404 处理程序处理,则为true
,否则为false
。socket
- 入站请求的基础连接。
内部重定向的情况。
-
is404
- 如果请求由404处理程序处理,则为true
,否则为false
。 -
socket
- 入站请求的基础连接。 -
context
- 已弃用,请使用request.routeOptions.config
替代。Fastify 内部对象。请勿直接使用或修改它。访问一个特殊键时有用:context.config
- 路由的config
对象。
-
routeOptions
- 路由的option
对象。bodyLimit
- 服务器限制或路由限制。config
- 此路由的config
对象。method
- 路径的 HTTP 方法。url
- 匹配此路径的 URL 的路径部分。handler
- 此路由的处理程序。attachValidation
- 如果定义了模式,则将validationError
追加到请求中。logLevel
- 此路由定义的日志级别。schema
- 此路由的 JSON 模式定义。version
- 定义端点版本的兼容 semver 的字符串。exposeHeadRoute
- 对于任何 GET 路径创建一个同级 HEAD 路由。prefixTrailingSlash
- 用于确定如何处理带有前缀的/
路径的字符串。
-
.getValidationFunction(schema | httpPart) - 返回指定模式或 HTTP 部分(如果已设置或缓存)的验证函数。
-
.compileValidationSchema(schema, [httpPart]) - 编译指定的模式并返回使用默认(或自定义)
ValidationCompiler
的验证函数。可选参数httpPart
如果提供则传递给ValidationCompiler
,默认为null
。 -
.validateInput(data, schema | httpPart, [httpPart]) - 使用指定的模式验证输入并返回序列化的负载。如果提供了
httpPart
,函数将使用该 HTTP 状态码的序列化器。默认为null
。
请求头
request.headers
是一个获取器,返回包含传入请求头的对象。自定义头部设置如下:
request.headers = {
'foo': 'bar',
'baz': 'qux'
}
此操作会向请求头添加新的值,并可通过 request.headers.bar
访问这些新值。标准的请求头仍然可以通过 request.raw.headers
访问。
出于性能原因,在“未找到”路由时,可能会在头部中添加 Symbol('fastify.RequestAcceptVersion')
。
ℹ️ 注意:模式验证可能修改
request.headers
和request.raw.headers
对象,导致头部为空。
fastify.post('/:params', options, function (request, reply) {
console.log(request.body)
console.log(request.query)
console.log(request.params)
console.log(request.headers)
console.log(request.raw)
console.log(request.server)
console.log(request.id)
console.log(request.ip)
console.log(request.ips)
console.log(request.host)
console.log(request.hostname)
console.log(request.port)
console.log(request.protocol)
console.log(request.url)
console.log(request.routeOptions.method)
console.log(request.routeOptions.bodyLimit)
console.log(request.routeOptions.method)
console.log(request.routeOptions.url)
console.log(request.routeOptions.attachValidation)
console.log(request.routeOptions.logLevel)
console.log(request.routeOptions.version)
console.log(request.routeOptions.exposeHeadRoute)
console.log(request.routeOptions.prefixTrailingSlash)
console.log(request.routeOptions.logLevel)
request.log.info('some info')
})
获取验证函数 (.getValidationFunction(schema | httpPart))
通过调用此函数并提供 schema
或 httpPart
,它会返回一个用于验证不同类型输入的 validation
函数。如果使用提供的输入找不到序列化函数,则返回 undefined
。
该函数具有一个 errors
属性。在最后一次验证过程中遇到的错误会被赋值给 errors
。
const validate = request.getValidationFunction({
type: 'object',
properties: {
foo: { type: 'string' }
}
})
console.log(validate({ foo: 'bar' })) // true
console.log(validate.errors) // null
// 或
const validate = request.getValidationFunction('body')
console.log(validate({ foo: 0.5 })) // false
console.log(validate.errors) // 验证错误信息
有关编译验证模式的更多信息,请参见 .compileValidationSchema(schema, [httpStatus])。
编译验证模式(schema, [httpPart])
此函数用于编译一个验证模式,并返回一个用于验证数据的函数。
返回的函数(也称为 验证函数)使用提供的
SchemaController#ValidationCompiler
进行编译。 使用 WeakMap
来缓存这个结果,减少编译调用次数。
可选参数 httpPart
如果提供,则传递给 ValidationCompiler
,允许其在自定义的验证模式编译器提供的路由中编译验证函数。
此函数具有一个 errors
属性。 最近一次验证过程中遇到的错误将被赋值给 errors
。
const validate = request
.compileValidationSchema({
type: 'object',
properties: {
foo: {
type: 'string'
}
}
})
console.log(validate({ foo: 'bar' })) // true
console.log(validate.errors) // null
// 或者
const validate = request
.compileValidationSchema({
type: 'object',
properties: {
foo: {
type: 'string'
}
}
}, 200)
console.log(validate({ hello: 'world' })) // false
console.log(validate.errors) // 验证错误
请注意在使用此函数时要小心,因为它会根据提供的模式缓存编译后的验证函数。如果模式被修改或更改,验证函数将无法检测到这些变更,并且会重复使用之前编译的验证函数,因为缓存是基于模式引用的。
如果需要更改模式属性,请创建一个新的模式对象以利用缓存机制。
以下是一个示例模式:
const schema1 = {
type: 'object',
properties: {
foo: {
type: 'string'
}
}
}
不要这样做
const validate = request.compileValidationSchema(schema1)
// 后续操作...
schema1.properties.foo.type. = 'integer'
const newValidate = request.compileValidationSchema(schema1)
console.log(newValidate === validate) // true
而应该这样做
const validate = request.compileValidationSchema(schema1)
// 后续操作...
const newSchema = Object.assign({}, schema1)
newSchema.properties.foo.type = 'integer'
const newValidate = request.compileValidationSchema(newSchema)
console.log(newValidate === validate) // false
.validateInput(data, [schema | httpStatus], [httpStatus])
此函数根据提供的模式或HTTP部分验证输入。如果两者都提供,则httpPart
参数优先。
如果没有为给定的schema
存在验证函数,将编译一个新的验证函数,并在提供时传递httpPart
。
request
.validateInput({ foo: 'bar'}, {
type: 'object',
properties: {
foo: {
type: 'string'
}
}
}) // true
// 或
request
.validateInput({ foo: 'bar'}, {
type: 'object',
properties: {
foo: {
type: 'string'
}
}
}, 'body') // true
// 或
request
.validateInput({ hello: 'world'}, 'query') // false
有关编译验证模式的更多信息,请参见 .compileValidationSchema(schema, [httpStatus])。