API Gateway + Lambda で csv ダウンロードリンクを行いたいです。ただし、ラムダが常に 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ファイルに.
"\"car\",\"price\",\"color\"\n\"Audi\",40000,\"blue\"\n\"BMW\",35000,\"black\"\n \"ポルシェ\",60000,\"緑\""
更新しました:
私はまだ努力していますが、少なくとも私には方向性があります。ところで、$input.body.replaceAll に関する API Gateway のドキュメントが見つかりません。replaceAllはJava関数ですか?
最後に、Api Gateway テンプレートの以下のコードでこれを解決します。
$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
テンプレートの最終的な replaceAll は奇妙です。CSV は \n または \r\n を認識しませんが、IDE で改行をコピーしてコードに渡します。それは機能し、魔法のようです。