nodejs s3-streams ReadStream抛出未指定的错误事件

时间:2017-07-19 20:59:14

标签: node.js amazon-web-services amazon-s3

我正在尝试从S3下载文件(我已成功上传文件)

const fs = require('fs');
const AWS = require('aws-sdk');
const S3 = AWS.S3;
const S3S = require('s3-streams');

const awsSettings = {
    ... // config stuff
}

var s3Instance = new S3(awsSettings);
module.exports = {
    download: (remoteReference, bucket, saveFile) => {
        return new Promise((resolve, reject) => {
            let download = new S3S.ReadStream(s3Instance, {
                Bucket: bucket,
                Key: remoteReference
            });
            download.pipe(fs.createWriteStream(saveFile))
            .on('finish', () => {
                resolve();
            })
            .on('error', (err) => {
                reject(err);
            });
        });
    },
}

但是,调用下载时节点崩溃

崩溃日志:

server/node_modules/aws-sdk/lib/request.js:31
            throw err;
            ^
Error: Uncaught, unspecified "error" event. ([object Object])
    at S3ReadStream.emit (events.js:163:17)
    at Request.httpHeaders (server/node_modules/s3-streams/lib/read.js:52:9)
    at Request.callListeners (server/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
    at Request.emit (server/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
    at Request.emit (server/node_modules/aws-sdk/lib/request.js:683:14)
    at IncomingMessage.onHeaders (server/node_modules/aws-sdk/lib/event_listeners.js:245:24)
    at emitThree (events.js:116:13)
    at IncomingMessage.emit (events.js:194:7)
    at ClientRequest.<anonymous> (server/node_modules/aws-sdk/lib/http/node.js:46:16)
    at ClientRequest.g (events.js:292:16)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:188:7)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:473:21)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)
    at TLSSocket.socketOnData (_http_client.js:362:20)
    at emitOne (events.js:96:13)

我不确定导致这个问题的原因是什么,但深入挖掘s3-stream源代码,似乎无法请求http标头并发出错误。

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

var s3Instance = new S3(awsSettings);
module.exports = {
  download: (remoteReference, bucket, saveFile) => {
    return new Promise((resolve, reject) => {
      let download = S3S.ReadStream(s3Instance, {
        Bucket: bucket,
        Key: remoteReference
      })
      .on('finish', () => {
        resolve();
      })
      .on('error', (err) => {
        reject(err);
      })
      .pipe(fs.createWriteStream(saveFile));
    });
  },
}