使用中间件在 Adonisjs 中定义响应结构

Define response structure in Adonisjs with Middleware

我想以最简单的方式定义我的请求的响应结构,我想到的第一件事就是中间件。 我的端点正确返回响应内容:

{{base_url}}/users returns 用户列表:

{
  [
    {
      "id": 44,
      "name": "some name"
      [...]
    }
  ]
}

我想做的(在所有请求中)是添加字段 statusdata(或任何其他我想添加的字段),如下所示:

{
  "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 方法,该方法接受两个参数,statusdata,并将它们发送回客户。

在这里你可以看到如何使用它:

Route.get('/users', async ({ response }) => {
  let status = ''// whatever you want
  let data = ''// whatever you want
  return response.customJson(status, data)
})