0

现在我必须以这种方式返回我的数据,使用以下代码:

import middy from '@middy/core';
import httpErrorHandler from '@middy/http-error-handler';
import jsonBodyParser from '@middy/http-json-body-parser';

async function sampleFunction (event) {
  const result = await someCodeWith(event.body);
  return result;
}

export const handler = middy(sampleFunction)
  .use(jsonBodyParser())
  .use(httpErrorHandler());

但我收到一个错误作为回应:

{
  "message": "Internal server error"
}

所以我需要返回这个对象内的数据:

return {
  statusCode: 200,
  body: JSON.stringify(error)
};

但我认为通过使用 middy 我不需要创建那个对象,它已经被字符串化并且里面还有一个 statusCode。我不想为 200、400、500 等手动设置每个 statusCode。有没有办法只return data将数据作为 javascript 对象?

4

2 回答 2

1

Middy 可以被多个事件上下文使用。在这种情况下,API Gateway 要求响应遵循您描述的以下模式。您可以添加自己的中间件以在响应返回之前对其进行转换。

像这样的东西:

// middy v2
const strigifyResponseV2 = () => {
  return {
    after: (request) => {
      request.response = {
        statusCode: 200,
        body: JSON.stringify(request.response)
      }
    }  
  }
}

// middy v1
const strigifyResponseV1 = () => {
  return {
    after: (handler, next) => {
      handler.response = {
        statusCode: 200,
        body: JSON.stringify(handler.response)
      }
      next()
    }  
  }
}

export const handler = middy(sampleFunction)
  .use(strigifyResponseV2())
  .use(jsonBodyParser())
  .use(httpErrorHandler());

于 2021-01-18T07:28:44.040 回答
1

这适用于 Middy 2:

const strigifyResponse = () => ({
  after: async (request) => {
    request.response = {
      statusCode: 200,
      body: JSON.stringify(request.response)
    }
  }
})

当然,你需要以同样的方式使用它:

export const handler = middy(sampleFunction)
  .use(strigifyResponse())
  .use(jsonBodyParser())
  .use(httpErrorHandler());
于 2021-11-03T12:31:56.850 回答