请求
请求
处理程序函数的第一个参数是 Request。
Request 是一个核心 Fastify 对象,包含以下字段
query- 解析后的查询字符串,其格式由querystringParser指定body- 请求负载,有关 Fastify 本机解析哪些请求负载以及如何支持其他内容类型的详细信息,请参阅 内容类型解析器params- 与 URL 匹配的参数headers- 标头 getter 和 setterraw- 来自 Node 核心的传入 HTTP 请求server- Fastify 服务器实例,作用域限定为当前的 封装上下文id- 请求 IDlog- 传入请求的日志记录器实例ip- 传入请求的 IP 地址ips- IP 地址数组,按从近到远的顺序排列,位于传入请求的X-Forwarded-For标头中(仅当trustProxy选项启用时)host- 传入请求的主机(当trustProxy选项启用时,从X-Forwarded-Host标头派生)。为了与 HTTP/2 兼容,如果不存在主机标头,则返回:authority。hostname- 传入请求的主机,不包含端口port- 服务器正在侦听的端口protocol- 传入请求的协议(https或http)method- 传入请求的方法url- 传入请求的 URLoriginalUrl- 与url类似,这允许您在内部重新路由的情况下访问原始urlis404- 如果请求由 404 处理程序处理,则为 true,否则为 falsesocket- 传入请求的基础连接context- 已弃用,请改用request.routeOptions.config。Fastify 内部对象。您不应该直接使用或修改它。它用于访问一个特殊的键context.config- 路由config对象。
routeOptions- 路由option对象bodyLimit- 服务器限制或路由限制config- 此路由的config对象method- 路由的 HTTP 方法url- 与此路由匹配的 URL 路径handler- 此路由的处理程序attachValidation- 将validationError附加到请求(如果定义了模式)logLevel- 为此路由定义的日志级别schema- 此路由的 JSON 模式定义version- 定义端点版本的与语义版本兼容的字符串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 是一个 getter,它返回一个包含传入请求标头的对象。您可以像这样设置自定义标头
request.headers = {
'foo': 'bar',
'baz': 'qux'
}
此操作将在请求标头中添加新值,可以通过调用 request.headers.bar 读取这些值。此外,您仍然可以通过 request.raw.headers 属性访问标准请求的标头。
注意:出于性能原因,在“未找到”路由上,您可能会看到我们在标头中添加了一个额外的属性
Symbol('fastify.RequestAcceptVersion')。
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
// or
const validate = request
.getValidationFunction('body')
console.log(validate({ foo: 0.5 })) // false
console.log(validate.errors) // validation errors
有关如何编译验证函数的更多信息,请参阅 .compileValidationSchema(schema, [httpStatus])。
.compileValidationSchema(schema,[httpPart])
此函数将编译验证模式并返回一个可用于验证数据的函数。返回的函数(也称为验证函数)是通过使用提供的 SchemaController#ValidationCompiler 编译的。使用 WeakMap 对其进行缓存,从而减少编译调用次数。
如果提供,则可选参数 httpPart 将直接转发到 ValidationCompiler,因此如果为路由提供了自定义 ValidationCompiler,则可以使用它来编译验证函数。
此函数具有 errors 属性。上次验证期间遇到的错误被分配给 errors
const validate = request
.compileValidationSchema({
type: 'object',
properties: {
foo: {
type: 'string'
}
}
})
console.log(validate({ foo: 'bar' })) // true
console.log(validate.errors) // null
// or
const validate = request
.compileValidationSchema({
type: 'object',
properties: {
foo: {
type: 'string'
}
}
}, 200)
console.log(validate({ hello: 'world' })) // false
console.log(validate.errors) // validation errors
请注意,在使用此函数时应谨慎,因为它将根据提供的模式缓存已编译的验证函数。如果提供的模式发生变异或更改,则验证函数将无法检测到模式已更改,例如,它将重用先前编译的验证函数,因为缓存基于先前提供的模式(对象)的引用。
如果需要更改模式的属性,始终选择创建一个全新的模式(对象),否则实现将无法从缓存机制中获益。
以以下模式为例
const schema1 = {
type: 'object',
properties: {
foo: {
type: 'string'
}
}
}
不要
const validate = request.compileValidationSchema(schema1)
// Later on...
schema1.properties.foo.type. = 'integer'
const newValidate = request.compileValidationSchema(schema1)
console.log(newValidate === validate) // true
而是
const validate = request.compileValidationSchema(schema1)
// Later on...
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
// or
request
.validateInput({ foo: 'bar'}, {
type: 'object',
properties: {
foo: {
type: 'string'
}
}
}, 'body') // true
// or
request
.validateInput({ hello: 'world'}, 'query') // false
有关如何编译验证模式的更多信息,请参阅 .compileValidationSchema(schema, [httpStatus])。