Angular - 如何将S3存储桶内容作为Observable获取

时间:2017-10-27 05:49:44

标签: javascript angular amazon-web-services amazon-s3 rxjs

如何构建Angular4中的服务方法以进行s3.listObjects调用以将S3存储桶的内容作为Observable返回?

这是我目前正在尝试的事情,悲惨地失败了:

public loadFilesFromS3(): Observable<any[]> {

    const s3 = new AWS.S3();
    const params = {
      Bucket: 'bucket-name',
      Prefix: 'prefix-name'
    };

    return (
      s3.listObjects(params, (err, data) => {
        if (err) {
          throw err;
        } else {
          return(data);
        }
      })
    )

  }

暂时完全坚持这一点! : - |

2 个答案:

答案 0 :(得分:0)

嗯,经过一些功课后,我想出了什么。似乎运作良好:

private tracksListSubject = new BehaviorSubject([]);
public tracksList$: Observable<Track[]> = this.tracksListSubject.asObservable();

public loadTracksFromS3() {

    console.log('loading tracks from S3...');

    this.authenticate();

    const s3 = new AWS.S3();
    const params = {
      Bucket: config.AWS_BUCKET_NAME
    };

    s3.listObjects(params, (err, data) => {
      if (err) {
        console.log('error!', err);
      }

      const raw = data.Contents;
      const tracks: Track[] = [];
      raw.forEach((item) => {
        tracks.push({
          id: item.ETag,
          title: item.Key,
          url: config.AWS_BASE_URL + item.Key,
          size: Math.round(item.Size / 1024 / 1024 * 10) / 10
        })
      });

      console.log(tracks.length, 'tracks loaded');
      this.tracksListSubject.next(tracks);
    });

  }

然后在其他组件中,我可以注入此服务并订阅其上的tracksList$属性。每当我修改服务中的曲目列表时,我都会发出this.tracksListSubject.next(newTracksList)

答案 1 :(得分:0)

您应该能够使用Observable.bindNodeCallback函数将s3.listObjects函数从节点样式回调转换为返回Observable的函数。

const listObjectsAsObservable = Observable.bindNodeCallback(s3.listObjects.bind(s3));

请注意,如上所示,您需要将s3对象绑定到函数,告诉它s3是this。否则,您将收到错误。

然后您可以按如下方式使用它:

const params = {
  Bucket: config.AWS_BUCKET_NAME
};
listObjectsAsObservable(params)
  .subscribe({
    next: (response) => console.log(response),
    error: (err) => console.log(err)
  });