4

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 で改行をコピーしてコードに渡します。それは機能し、魔法のようです。

4

2 に答える 2

8

この質問をしてからサーバーレスは少し変わりましたが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 以降を使用して、この例を直接コピーして貼り付けることをお勧めします。

于 2017-05-26T00:43:56.797 に答える