2016-11-10 6 views
0

それを解析私は、問題は、私はファイルを解析するXLSX得ることができないということですnode-xlsxダウンロードのxlsxと

で解析し、アマゾンS3からExcelファイルをダウンロードするサービスを必要としています。私が書き込んだファイルを読み返そうとすると、コードで見つけられません。

私はこれが最善のアプローチであればかなりわからないんだけど、これは私がこれまでに得たものである:

router.get('/process', (req, res) => { 
    var fileName = 'https://some-bucket.s3.amazonaws.com/some-excel-file.xlsx' 
    https.get(fileName, response => { 
     var body = '' 
     response.on('data', chunk => body += chunk) 
     response.on('end',() => { 

      //fs is being imported early on this file 
      fs.writeFile(__dirname + '/test.xlsx', body) 

      var f = fs.createReadStream(__dirname + '/test.xlsx') 

      var book = xlsx.parse(f) 
      book.forEach(sheet => console.log('sheet', sheet.name)) 

      res.status(200)   
     }) 
     .on('error', e => { 
      res.status(500) 
     }) 
    }) 
    return 
}) 

答えて

2

これは、あなたがS3のnodejsからファイルを読み込み、最初のディスク上のいくつかの場所にファイルを書き込むことなく、メモリにそれを保つことができる方法です:完全にディスクへの書き込みを回避し、この方法を試してみてください。これは、S3とAWS Lambdaの組み合わせで使用できるので、ラムダのある場所にファイルを書き込む必要はありません。

このプロセスが非同期であることを忘れないでください。

var params = { 
     Bucket: "", 
     Key: "" 
    }; 

    var file = s3.getObject(params).createReadStream(); 
    var buffers = []; 

    file.on('data', function (data) { 
     buffers.push(data); 
    }); 

    file.on('end', function() { 
     var buffer = Buffer.concat(buffers); 
     var workbook = xlsx.parse(buffer); 
     console.log("workbook", workbook) 
    }); 
+0

このコードスニペットは、(http://meta.stackexchange.com/questions/114762/explaining-entirely-コードベース-回答可)[説明を含む]、疑問を解決するかもしれないが、実際に役立ちますあなたの投稿の質を向上させる。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 –

+0

私はそれを更新しました。 –

1

node-xlsxモジュール全体XLSXバッファが利用可能であることを必要とします。あなたが現在やっているように、それをReadStreamに渡すことはできません。

router.get('/process', (req, res) => { 
    var fileName = 'https://some-bucket.s3.amazonaws.com/some-excel-file.xlsx' 
    https.get(fileName, response => { 
     var chunks = [] 
     response.on('data', chunk => chunks.push(chunk)) 
     .on('end',() => { 
      var book = xlsx.parse(Buffer.concat(chunks)) 
      book.forEach(sheet => console.log('sheet', sheet.name)) 
      res.status(200)   
     }) 
     .on('error', e => { 
      res.status(500) 
     }) 
    }) 
    return 
}) 
関連する問題