如何构建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);
}
})
)
}
暂时完全坚持这一点! : - |
答案 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)
});