API网关&x2B;Lambda下载CSV文件

API网关&x2B;Lambda下载CSV文件,csv,aws-lambda,aws-api-gateway,serverless-framework,Csv,Aws Lambda,Aws Api Gateway,Serverless Framework,我想用API网关+Lambda做一个csv下载链接。 但是有一个问题是lambda总是返回JSON.stringify。有办法解决这个问题吗 s-function.json "responses": { "default": { "statusCode": "200", "responseParameters": { "method.response.header.Content-disposition": "'attachment; filena

我想用API网关+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文件中

“汽车”、“价格”、“颜色”、“奥迪”、“40000”、“蓝色”、“宝马”、“35000”、“黑色”、“保时捷”、“60000”、“绿色”

更新:

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

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

$input.body.replaceAll("\\""","").replaceAll("""","").replaceAll("\\n","
")
s函数转义双引号

"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中复制新行并传递给代码。它可以工作,而且很神奇。

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

$input.body.replaceAll("\\""","")
编辑:因此,如果我得到了正确的答案,我会大摇大摆地说:


自您提出此问题以来,Serverless发生了一些变化,但如果您使用的是集成的
lambda_proxy
方法,则可以使用如下处理程序:

module.exports.handler = (event, context, callback) => {
  const csvRows = [
    '1,"blah",123',
    '2,"qwe",456'
  ]
  const result = csvRows.reduce((prev, curr) => {
    return prev + '\n' + curr
  })
  callback(null, {
    headers: {
      'Content-Type': 'text/csv',
      'Content-disposition': 'attachment; filename=testing.csv'
    },
    body: result,
    statusCode: 200
  })
}

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

谢谢您让我知道方向!我更新问题@roll,我不知道那些话发生了什么,它们太可怕了。对不起,我已经修好了。最后,6个小时后。工作得很有魅力!但是,请记住,它只适用于高达6MB的文件。
module.exports.handler = (event, context, callback) => {
  const csvRows = [
    '1,"blah",123',
    '2,"qwe",456'
  ]
  const result = csvRows.reduce((prev, curr) => {
    return prev + '\n' + curr
  })
  callback(null, {
    headers: {
      'Content-Type': 'text/csv',
      'Content-disposition': 'attachment; filename=testing.csv'
    },
    body: result,
    statusCode: 200
  })
}