Node.js aws sdk.s3.getObject()上的Express在使用createReadStream()管道传输到res时缓冲区为空

Node.js aws sdk.s3.getObject()上的Express在使用createReadStream()管道传输到res时缓冲区为空,node.js,express,aws-sdk,Node.js,Express,Aws Sdk,有问题的代码,首先不尝试从响应创建读取流: app.get('/dashboard/downloadfile', requiresLogin, (req, res) => { const userid = req.user.id; const filename = req.query['file-name']; db.getFileKey([userid, filename], (keyres) => { const params = { Bucke

有问题的代码,首先不尝试从响应创建读取流:

app.get('/dashboard/downloadfile', requiresLogin, (req, res) => {
  const userid = req.user.id;
  const filename = req.query['file-name'];

  db.getFileKey([userid, filename], (keyres) => {
    const params = {
      Bucket: S3_BUCKET,
      Key: keyres.rows[0].filekey,
    };
    res.setHeader('Content-disposition', `attachment; filename=${ filename }`);
    res.setHeader('Content-type', 'text/plain');
    s3.getObject(params, (awserr, awsres) => {
      if(awserr) console.log(awserr);
      else console.log(awsres);
    });
  });
});
app.get('/dashboard/downloadfile', requiresLogin, (req, res) => {
  const userid = req.user.id;
  const filename = req.query['file-name'];

  db.getFileKey([userid, filename], (keyres) => {
    const params = {
      Bucket: S3_BUCKET,
      Key: keyres.rows[0].filekey,
    };
    res.setHeader('Content-disposition', `attachment; filename=${ filename }`);
    res.setHeader('Content-type', 'text/plain');
    s3.getObject(params, (awserr, awsres) => {
      if(awserr) console.log(awserr);
      else console.log(awsres);
    }).createReadStream().pipe(res);
  });
});
console.log(awsres)的结果

console.log(awsres)的结果

10:26:25 AM web.1{AcceptRanges:'bytes',
上午10:26:25 web.1 |最后修改:2018-07-23T23:27:29.000Z,
上午10:26:25 web.1 |内容长度:2519,
上午10:26:25 web.1 | ETag:“5ebd5ec977c868605a6efe830df8ee0d”,
上午10:26:25 web.1 |内容类型:“文本/普通”,
上午10:26:25 web.1 |元数据:{},
上午10:26:25 web.1 |正文:}

正如在问题中一样,我试图通过管道将文件传输到试图获取路由的客户端。我一辈子都想不出来。

不,我无法从客户端开始下载。客户端我正在使用vanilla JS,并使用XMLHttpRequest发出http请求。上传工作正常,我正在使用服务器从aws生成signedurl,然后客户端直接上传到s3Am我只是不了解流是如何工作的?这绝对是可能的。您可以从
s3.getObject
中删除回调,只需执行:
s3.getObject(params.createReadStream()…
我不知道lib在内部是如何工作的,但您可能无法同时使用回调(返回完整文件)和流。
app.get('/dashboard/downloadfile', requiresLogin, (req, res) => {
  const userid = req.user.id;
  const filename = req.query['file-name'];

  db.getFileKey([userid, filename], (keyres) => {
    const params = {
      Bucket: S3_BUCKET,
      Key: keyres.rows[0].filekey,
    };
    res.setHeader('Content-disposition', `attachment; filename=${ filename }`);
    res.setHeader('Content-type', 'text/plain');
    s3.getObject(params, (awserr, awsres) => {
      if(awserr) console.log(awserr);
      else console.log(awsres);
    }).createReadStream().pipe(res);
  });
});
10:26:25 AM web.1 |  { AcceptRanges: 'bytes',
10:26:25 AM web.1 |    LastModified: 2018-07-23T23:27:29.000Z,
10:26:25 AM web.1 |    ContentLength: 2519,
10:26:25 AM web.1 |    ETag: '"5ebd5ec977c868605a6efe830df8ee0d"',
10:26:25 AM web.1 |    ContentType: 'text/plain',
10:26:25 AM web.1 |    Metadata: {},
10:26:25 AM web.1 |    Body: <Buffer > }