首页 > 解决方案 > 使用中间件在 Adonisjs 中定义响应结构

问题描述

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

{{base_url}}/users返回用户列表:

{
  [
    {
      "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 文档和论坛,但没有适合我需要的答案。

欢迎任何帮助

标签: javascriptresponsemiddlewareadonis.js

解决方案


您可以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)
})

推荐阅读