Jim*_*Jim 1 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": ""
}
}
}
Run Code Online (Sandbox Code Playgroud)
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);
};
Run Code Online (Sandbox Code Playgroud)
在下载的csv文件中。
“ \”汽车\“,\”价格\“,\”颜色\“ \ n \”奥迪“,40000,\”蓝色\“ \ n \”宝马“,35000,\”黑色\“ \ n \“ Porsche \”,60000,\“绿色\”“
更新:
我仍在尝试,但至少谢谢您的指导。顺便说一句,我找不到关于$ input.body.replaceAll的API网关文档。replaceAll是Java函数吗?
最后,我通过Api Gateway模板中的以下代码解决了这个问题。
$input.body.replaceAll("\\""","").replaceAll("""","").replaceAll("\\n","
")
Run Code Online (Sandbox Code Playgroud)
s函数转义了双引号。
"responseTemplates": {
"text/csv": "$input.body.replaceAll(\"\\\\\"\"\",\"\").replaceAll(\"\"\"\",\"\").replaceAll(\"\\\\n\",\"\n\")"
}
Run Code Online (Sandbox Code Playgroud)
返回数据:
car,price,color
Audi,40000,blue
BMW,35000,black
Porsche,60000,green
Run Code Online (Sandbox Code Playgroud)
模板最终的replaceAll很奇怪。CSV无法识别\ n或\ r \ n,但是我尝试在IDE中复制新行并传递给代码。它的工作原理很神奇。
自从您问这个问题以来,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
})
}
Run Code Online (Sandbox Code Playgroud)
注意:我已经使用过ES6功能,因此您将要使用Node 6或更高版本直接复制粘贴此示例。
如果您无法在 Lambda 函数上修复此问题,您可以在 API Gateway 映射模板中执行replaceAll()。我认为这可以用来替换转义的双引号:
$input.body.replaceAll("\\""","")
Run Code Online (Sandbox Code Playgroud)
编辑:所以招摇会是(如果我转义正确的话):
"responses": {
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Content-disposition": "'attachment; filename=testing.csv'"
},
"responseTemplates": {
"text/csv": "$input.body.replaceAll(\"\\\"\"\",\"\")"
}
}
}
Run Code Online (Sandbox Code Playgroud)