Strapi 后端服务器基于 Koa。当您通过 REST API 发送请求时,上下文对象 (ctx
) 会传递给 Strapi 后端的每个元素(例如 policies、controllers、services)。
ctx
包含 3 个主要对象:
ctx.request
用于获取客户端发出 API 请求时发送的请求信息,ctx.state
用于获取 Strapi 后端内请求状态信息,ctx.response
用于获取服务器将返回的响应信息。
还可以使用 strapi.requestContext
函数 从代码中的任何位置访问请求的上下文。
除了以下文档中描述的概念和参数外,您还可以在 Koa 请求文档、Koa Router 文档 和 Koa 响应文档 中找到更多信息。
该图表示请求如何通过 Strapi 后端的简化版本,其中突出显示了请求和响应。后端定制介绍页面包含一个完整的交互式图表。
ctx.request
ctx.request
对象包含以下参数:
参数 | 描述 | 类型 |
---|---|---|
ctx.request.body | 解析后的主体版本。 | Object |
ctx.request.files | 随请求发送的文件。 | Array |
ctx.request.headers | 随请求发送的标头。 | Object |
ctx.request.host | URL 的主机部分,包括端口。 | String |
ctx.request.hostname | URL 的主机部分,不包括端口。 | String |
ctx.request.href | 请求资源的完整 URL,包括协议、域、端口(如果指定)、路径和查询参数。 | String |
ctx.request.ip | 发送请求的人的 IP。 | String |
ctx.request.ips | 当存在 X-Forwarded-For 并且启用了 app.proxy 时,将返回一个 IP 数组,从上游到下游排序。例如,如果值为“client, proxy1, proxy2”,您将收到 ["client", "proxy1", "proxy2"] 数组。 | Array |
ctx.request.method | 请求方法(例如 GET 、POST )。 | String |
ctx.request.origin | 第一个 / 之前的 URL 部分。 | String |
ctx.request.params | URL 中发送的参数。 例如,如果内部 URL 是 /restaurants/:id ,则您在实际请求中替换 :id 的任何内容都可以通过 ctx.request.params.id 访问。 | Object |
ctx.request.path | 请求资源的路径,不包括查询参数。 | String |
ctx.request.protocol | 使用的协议(例如,https 或 http )。 | String |
ctx.request.query | Strapi 特定的 查询参数。 | Object |
ctx.request.subdomains | URL 中包含的子域。 例如,如果域是 tobi.ferrets.example.com ,则值为以下数组:["ferrets", "tobi"] 。 | Array |
ctx.request.url | 请求资源的路径和查询参数,不包括协议、域和端口。 | String |
协议、来源、url、href、路径、主机和主机名之间的区别:
给定一个发送到 https://example.com:1337/api/restaurants?id=123
URL 的 API 请求,以下是 ctx.request
对象返回的不同参数:
参数 | 返回值 |
---|---|
ctx.request.href | https://example.com:1337/api/restaurants?id=123 |
ctx.request.protocol | https |
ctx.request.host | localhost:1337 |
ctx.request.hostname | localhost |
ctx.request.origin | https://example.com:1337 |
ctx.request.url | /api/restaurants?id=123 |
ctx.request.path | /api/restaurants |
ctx.request.query
ctx.request
提供了一个 query
对象,可以访问 Strapi 查询参数。下表列出了可用的参数,并附有简短说明和相关 REST API 文档部分的链接(有关更多信息,请参阅 REST API 参数):
参数 | 说明 | 类型 |
---|---|---|
ctx.request.query ctx.query | 整个查询对象。 | 对象 |
ctx.request.query.sort | 用于 对响应进行排序 的参数 | String 或 Array |
ctx.request.query.filters | 用于 过滤响应 的参数 | Object |
ctx.request.query.populate | 用于 填充关系、组件或动态区域 的参数 | String 或 Object |
ctx.request.query.fields | 用于 仅选择与响应一起返回的特定字段 的参数 | Array |
ctx.request.query.pagination | 用于 翻阅条目 的参数 | Object |
ctx.request.query.publicationState | 选择草稿和发布状态 的参数 | String |
ctx.request.query.locale | 选择一个或多个语言环境 的参数 | String 或 Array |
ctx.state
ctx.state
对象允许访问 Strapi 后端内请求的状态,包括有关 用户、身份验证、路由 的特定值:
参数 | 说明 | 类型 |
---|---|---|
ctx.state.isAuthenticated | 返回当前用户是否以任何方式进行了身份验证。 | Boolean |
ctx.state.user
ctx.state.user
对象允许访问有关执行请求的用户的信息,并包含以下参数:
参数 | 说明 | 类型 |
---|---|---|
ctx.state.user | 用户信息。仅填充一个关系。 | Object |
ctx.state.user.role | 用户角色 | Object |
ctx.state.auth
ctx.state.auth
对象允许访问与身份验证相关的信息,并包含以下参数:
参数 | 说明 | 类型 |
---|---|---|
ctx.state.auth.strategy | 有关当前使用的身份验证策略的信息(用户和权限插件或API 令牌 | Object |
ctx.state.auth.strategy.name | 当前使用的策略的名称 | String |
ctx.state.auth.credentials | 用户的凭据 | String |
ctx.state.route
ctx.state.route
对象允许访问与当前路由相关的信息,并包含以下参数:
参数 | 说明 | 类型 |
---|---|---|
ctx.state.route.method | 用于访问当前路由的方法。 | String |
ctx.state.route.path | 当前路由的路径。 | String |
ctx.state.route.config | 当前路由的配置信息。 | Object |
ctx.state.route.handler | 当前路由的处理程序(控制器)。 | Object |
ctx.state.route.info | 当前路由的其他信息,例如 apiName 和 API 请求类型。 | Object |
ctx.state.route.info.apiName | 使用的 API 的名称。 | String |
ctx.state.route.info.type | 使用的 API 的类型。 | String |
ctx.response
ctx.response
对象可以访问并返回服务器的响应信息,并包括以下参数:
参数 | 描述 | 类型 |
---|---|---|
ctx.response.body | 响应主体。 | 任何 |
ctx.响应.状态 | 响应的状态代码。 | 整数 |
ctx.response.message | 响应的状态消息。 默认情况下, response.message 与response.status 相关联。 | 字符串 |
ctx.response.header ctx.response.headers | 与响应一起发送的标头。 | 对象 |
ctx.响应.长度 | Content-Length 标头值(如果存在)为数字,或从 ctx.body (如果可能);否则返回 undefined 。 | Integer |
ctx.response.redirect ctx.response.redirect(url, [alt]) | 执行 302 重定向至URL。字符串“back”是特殊情况,用于提供 Referrer 支持;当 Referrer 不存在时,将使用 alt 或“/”。示例: ctx.response.redirect('back ', '/index.html'); | 函数 |
ctx.response.attachment ctx.response.attachment([filename], [options]) | 设置 Content-Disposition 标头添加到“附件”以通知客户端提示下载。可选择指定下载的文件名和一些 选项。 | Function |
ctx.response.type | Content-Type 标头,没有“charset”等参数。 | String |
ctx.response.lastModified | Last-Modified 标头作为日期(如果存在)。 | DateTime |
ctx.response.etag | 设置响应的 ETag ,包括包装的“s”。没有相应的 response.etag getter。 | String |
在任何地方访问请求上下文
strapi.requestContext
适用于 Strapi v4.3.9+。
Strapi 公开了一种从代码中的任何位置访问当前请求上下文的方法(例如生命周期函数)。
您可以按如下方式访问请求:
const ctx = strapi.requestContext.get()
您只应在 HTTP 请求上下文中调用的函数内部使用它。
// correct
const service = {
myFunction() {
const ctx = strapi.requestContext.get()
console.log(ctx.state.user)
},
}
// incorrect
const ctx = strapi.requestContext.get()
const service = {
myFunction() {
console.log(ctx.state.user)
},
}
Example:
module.exports = {
beforeUpdate() {
const ctx = strapi.requestContext.get()
console.log('User info in service: ', ctx.state.user)
},
}
Strapi 使用名为 AsyncLocalStorage 的 Node.js 功能来使上下文可在任何地方使用。