Как транслировать данные файла из S3 с Node.JS - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь передать загруженный файл обратно в мой Express API.

Вот документы AWS, которые я получаю: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/requests-using-stream-objects.html

Вот мой текущий маршрут:

router.put('/:id/download', async (req, res, next) => {
  console.log('hitting download route')

  var id = req.params.id;
  let upload = await Upload.query().findById( id ).eager('user');

  console.log("file to download is: ", upload.name)

  AWS.config.update({
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  });

  const s3 = new AWS.S3();

  var params = {
    Bucket: process.env.AWS_BUCKET, 
    Key: upload.file_url.split("com/").reverse()[0]
  };

  var fileStream = fs.createWriteStream('/tmp/file.docx');
  var s3Stream = s3.getObject(params).createReadStream();

  // Listen for errors returned by the service
  s3Stream.on('error', function(err) {
    // NoSuchKey: The specified key does not exist
    console.error(err);
  });

  let results=s3Stream.pipe(fileStream).on('error', function(err) {
    // capture any errors that occur when writing data to the file
    console.error('File Stream:', err);
  }).on('close', function() {
    console.log('this is results: ', results)

    console.log('Done.');
  });

  // mammoth.convertToHtml({ path: '/Users/dariusgoore/Downloads/1585930968750.docx' })
  //   .then(async function(result) {
  //     await Upload.query().findById( id )
  //       .patch({
  //          html: result.value,
  //          conversion_messages: result.messages
  //       })  
  //     res.json(result);
  //   })

    // .done();

  res.send('Success!')
});

Этот код не выдает ошибку, не имеет права на указанный файл.

вот консольный журнал результатов потока:

Running on localhost:8000
hitting download route
file to download is:  COVID-19.docx
this is results:  WriteStream {
  _writableState:
   WritableState {
     objectMode: false,
     highWaterMark: 16384,
     finalCalled: true,
     needDrain: false,
     ending: true,
     ended: true,
     finished: true,
     destroyed: true,
     decodeStrings: true,
     defaultEncoding: 'utf8',
     length: 0,
     writing: false,
     corked: 0,
     sync: false,
     bufferProcessing: false,
     onwrite: [Function: bound onwrite],
     writecb: null,
     writelen: 0,
     bufferedRequest: null,
     lastBufferedRequest: null,
     pendingcb: 0,
     prefinished: true,
     errorEmitted: false,
     emitClose: false,
     bufferedRequestCount: 0,
     corkedRequestsFree:
      { next: null,
        entry: null,
        finish: [Function: bound onCorkedFinish] } },
  writable: false,
  domain: null,
  _events:
   [Object: null prototype] { error: [Function], close: [Function] },
  _eventsCount: 2,
  _maxListeners: undefined,
  path: '/tmp/file.docx',
  fd: null,
  flags: 'w',
  mode: 438,
  start: undefined,
  autoClose: true,
  pos: undefined,
  bytesWritten: 7006,
  closed: true }
Done.
...