API Gateway + Lambda下载CSV文件

时间:2016-08-02 06:46:46

标签: csv aws-lambda aws-api-gateway serverless-framework

我想用API Gateway + Lambda做一个csv下载链接。 但是有一个问题,lambda总是返回JSON.stringify。有办法解决这个问题吗?

S-function.json

"responses": {
    "default": {
      "statusCode": "200",
      "responseParameters": {
        "method.response.header.Content-disposition": "'attachment; filename=testing.csv'"
      },
      "responseTemplates": {
        "text/csv": ""
      }
    }
  }

handler.js

var json2csv = require('json2csv');
module.exports.handler = function(event, context, cb) {
   var fields = ['car', 'price', 'color'];
   var myCars = [
    {
      "car": "Audi",
      "price": 40000,
      "color": "blue"
    }, {
      "car": "BMW",
      "price": 35000,
      "color": "black"
    }, {
      "car": "Porsche",
      "price": 60000,
      "color": "green"
    }
   ]; 
    var csv = json2csv({ data: myCars, fields: fields });
    return cb(null, csv);
};

在下载的csv文件中。

  

“\” 汽车\ “\ ”价格\“,\ ”颜色\“ \ n \ ”奥迪\“,40000,\ ”蓝\“ \ n \ ”BMW \“,35000,\” 黑\ “\ n \” 保时捷\ “60000,\ ”绿色\“”

更新:

我还在努力,但至少谢谢你,我有方向。 顺便说一下,我找不到关于$ input.body.replaceAll的API Gateway文档。 replaceAll是Java函数吗?

最后,我通过Api网关模板中的以下代码解决了这个问题。

$input.body.replaceAll("\\""","").replaceAll("""","").replaceAll("\\n","
")

s-function转义双引号。

"responseTemplates": {
    "text/csv": "$input.body.replaceAll(\"\\\\\"\"\",\"\").replaceAll(\"\"\"\",\"\").replaceAll(\"\\\\n\",\"\n\")"
}

返回数据:

car,price,color
Audi,40000,blue
BMW,35000,black
Porsche,60000,green

模板最终替换所有都很奇怪。 CSV无法识别\ n或\ r \ n,但我尝试在IDE中复制新行并传递给代码。它有效,而且很神奇。

2 个答案:

答案 0 :(得分:5)

自从您提出此问题后,无服务器已经发生了一些变化,但如果您使用的是key.hashCode() & (2048 - 1)积分方法,则可以使用以下处理程序:

lambda_proxy

注意:我使用过ES6功能,因此您需要使用Node 6或更高版本直接复制粘贴此示例。

答案 1 :(得分:0)

如果您无法在Lambda函数上修复它,您可以在API网关映射模板中执行replaceAll()。我认为这可以仅用于替换转义的双引号:

$input.body.replaceAll("\\""","")

编辑:所以摇摆不定(如果我有权逃脱):

"responses": {
    "default": {
      "statusCode": "200",
      "responseParameters": {
        "method.response.header.Content-disposition": "'attachment; filename=testing.csv'"
      },
      "responseTemplates": {
        "text/csv": "$input.body.replaceAll(\"\\\"\"\",\"\")"
      }
    }
  }