11

我有一个无服务器应用程序,它将文件上传到 s3(通过 POST 请求)并为它们提供服务(通过 GET 请求)

我正在使用插件serverless-apigw-binaryserverless-apigwy-binary允许我以图像的形式返回二进制数据。为了允许 URL 与浏览器一起使用,我必须将二进制类型设置为*/*.

为了上传图像,POST 端点需要一个像 { "base64": "..." } 这样的主体。然而,通过这种配置,整个正文都以 base64 编码字符串的形式出现。如何防止请求正文application/json被转换?

serverless.yml下文:

service: image-service

custom:
  envName: ${opt:stage, self:provider.stage}
  domains:
    prod: api.<mydomain>
    dev: dev-api.<mydomain>
  customDomain:
    basePath: images
    domainName: ${self:custom.domains.${self:custom.envName}}
    certificateName: "*.<mydomain>"
  apigwBinary:
    types:
      - '*/*'

provider:
  name: aws
  runtime: nodejs8.10
  region: eu-west-1
  memorySize: 1536

  role: ImageRenderingRole

  environment:
    ENV_NAME: ${self:custom.envName}
    APP_NAME: image-service
    BUCKET: <mybucket>

plugins:
  - serverless-offline
  - serverless-domain-manager
  - serverless-apigw-binary
  - serverless-apigwy-binary

functions:
 uploadImage:
   handler: handler.uploadImage
   events:
     - http:
      path: /
      method: POST

  getImage:
    handler: handler.getImage
    events:
      - http:
          path: 'images/{idAndFormat}'
          method: get
          contentHandling: CONVERT_TO_BINARY
          parameters:
              paths:
                idAndFormat: true
4

1 回答 1

10

你有两个选择:

  1. 停止*/*用作类型选择器。这将所有内容都视为二进制,因此对所有内容进行 base64 编码。不幸的是,您不能表达规则的例外,只能表达遵循规则的事物。您可以添加必须被视为二进制的类型的综合列表,但这对我来说听起来很脆弱。

  2. 只需接受 base64 JSON 并在另一侧对其进行 de-base64 处理。这似乎最简单。您正在使用节点,它看起来像,并且有大量关于此的教程。当然,它增加了一些步骤和一些臃肿,但老实说,您正在使用 API Gateway 和 Lambda(它们是很好的工具,但是......)所以显然性能不必在这里调整到毫秒.

于 2018-09-26T18:44:34.257 回答