从S3下载xlsx并parsing它

我需要一个服务从Amazon S3下载一个excel文件,然后使用node-xlsx进行parsing

问题是我不能让xlsxparsing文件。 当我试图读回我刚刚写的文件时,代码找不到它。

我不太确定这是否是最好的方法,但这是我迄今为止:

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 }) 

fs.writeFile是asynchronous的。 该文件将不会在那里,直到callback被称为。

https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback

 fs.writeFile('message.txt', 'Hello Node.js', (err) => { if (err) throw err; console.log('It\'s saved!'); }); 

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 })