API网关&x2B;Lambda下载CSV文件
我想用API网关+Lambda做一个csv下载链接。 但是有一个问题是lambda总是返回JSON.stringify。有办法解决这个问题吗 s-function.jsonAPI网关&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
"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
})
}