使用中间件在 Adonisjs 中定义响应结构
Define response structure in Adonisjs with Middleware
我想以最简单的方式定义我的请求的响应结构,我想到的第一件事就是中间件。
我的端点正确返回响应内容:
{{base_url}}/users
returns 用户列表:
{
[
{
"id": 44,
"name": "some name"
[...]
}
]
}
我想做的(在所有请求中)是添加字段 status
和 data
(或任何其他我想添加的字段),如下所示:
{
"status": 200,
"data": [
{
"id": 44,
"name": "some name"
[...]
}
]
}
我创建了一个等待解析的中间件,但我无法获取内容,也无法向其中添加一些 属性。
[...]
async handle ({request, response}, next) {
await next()
const content = response._lazyBody.content
content.status = response.response.statusCode
}
[...]
我知道这行不通,但我想要类似的东西。我查看了 Adonis 文档和论坛,但没有符合我需要的答案。
欢迎任何帮助
您可以通过扩展核心来扩展Response
。最简单的方法是在 start
文件夹中创建一个文件并将其命名为 hooks.js
并将以下内容复制并粘贴到其中:
const { hooks } = use('@adonisjs/ignitor')
const Response = use('Adonis/Src/Response')
hooks.after.providersBooted(() => {
Response.macro('customJson', function (status, data) {
this.status(status).json({
status,
data
})
})
})
这段代码扩展了 Response
模块并向其添加了 customJson
方法,该方法接受两个参数,status
和 data
,并将它们发送回客户。
在这里你可以看到如何使用它:
Route.get('/users', async ({ response }) => {
let status = ''// whatever you want
let data = ''// whatever you want
return response.customJson(status, data)
})
我想以最简单的方式定义我的请求的响应结构,我想到的第一件事就是中间件。 我的端点正确返回响应内容:
{{base_url}}/users
returns 用户列表:
{
[
{
"id": 44,
"name": "some name"
[...]
}
]
}
我想做的(在所有请求中)是添加字段 status
和 data
(或任何其他我想添加的字段),如下所示:
{
"status": 200,
"data": [
{
"id": 44,
"name": "some name"
[...]
}
]
}
我创建了一个等待解析的中间件,但我无法获取内容,也无法向其中添加一些 属性。
[...]
async handle ({request, response}, next) {
await next()
const content = response._lazyBody.content
content.status = response.response.statusCode
}
[...]
我知道这行不通,但我想要类似的东西。我查看了 Adonis 文档和论坛,但没有符合我需要的答案。
欢迎任何帮助
您可以通过扩展核心来扩展Response
。最简单的方法是在 start
文件夹中创建一个文件并将其命名为 hooks.js
并将以下内容复制并粘贴到其中:
const { hooks } = use('@adonisjs/ignitor')
const Response = use('Adonis/Src/Response')
hooks.after.providersBooted(() => {
Response.macro('customJson', function (status, data) {
this.status(status).json({
status,
data
})
})
})
这段代码扩展了 Response
模块并向其添加了 customJson
方法,该方法接受两个参数,status
和 data
,并将它们发送回客户。
在这里你可以看到如何使用它:
Route.get('/users', async ({ response }) => {
let status = ''// whatever you want
let data = ''// whatever you want
return response.customJson(status, data)
})