无服务器Lambda函数无法映射为正确响应

时间:2019-12-10 10:52:44

标签: aws-lambda httpresponse serverless

我在正确返回使用无服务器框架部署的Lambda函数的响应时遇到问题:

module.exports.hello = async (event, context, callback) => {

  const content = fs.readFileSync('./cn23_template.html', 'utf-8')

  const Vue = require('vue')
  const app = new Vue({
    template: content,
    data: function () {
      return event
    }
  })

  const renderer = require('vue-server-renderer').createRenderer()
  const html = await renderer.renderToString(app)

  const browser = await chromium.puppeteer.launch({
    // Required
    executablePath: await chromium.executablePath,

    // Optional
    args: chromium.args,
    defaultViewport: chromium.defaultViewport,
    headless: chromium.headless || true
  });

  const page = await browser.newPage();
  await page.setContent(html);
  let pdf = await page.pdf({ pageRanges: '1', format: 'a4', printBackground: true });

  await browser.close();

  return {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/pdf',
      'Content-Length': pdf.length
    },
    body: pdf ? pdf.toString('base64') : null,
    isBase64Encoded: true
  }
}

我的serverless.yml文件:

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: post
          integration: lambda
          response:
            headers:
              Content-Type: "'Test'"
              Cache-Control: "'max-age=120'"

问题是我从函数返回的内容未正确映射到响应。响应不包括statusCodeheaders,它只使用整个返回的对象作为响应的主体。

除此之外,也不会使用.yml中配置的标头。

这似乎是一个非常愚蠢的错误,但是我只是在做Serverless API gateway docs内部的内容。

所以我的问题是:如何正确配置响应属性,以使HTTP请求使用无服务器框架给出正确的响应?

1 个答案:

答案 0 :(得分:0)

您需要配置lambda函数以将其作为lambda-proxy事件调用。

请参见Serverless Example Lambda Proxy