Skip to Content

请求

处理函数的第一个参数是 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 - 入站请求的协议(httpshttp)。
  • 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.headersrequest.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))

通过调用此函数并提供 schemahttpPart,它会返回一个用于验证不同类型输入的 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])