我看过其他一些文章,并试图复制他们所做的事情,但是似乎没有一个出现与我相同的问题。基本上,我试图存储S3存储桶中的密钥列表,以便可以在Vue应用程序中对其进行迭代。我有下面的代码,您可以看到我有3条console.log
语句要在其中打印files
的值。第一个完全按照我的期望打印,第二个完全打印[]
,第三个完全不打印。因此出于某种原因,它没有将files
的值保留在s3.listObjectsV2()
函数之外,这意味着我无法在应用程序中访问实际文件。
let AWS = require("aws-sdk");
AWS.config.update({
accessKeyId: process.env.VUE_APP_ACCESS_KEY,
secretAccessKey: process.env.VUE_APP_ACCESS_KEY,
region: "us-east-1",
});
let s3 = new AWS.S3();
let params = {
Bucket: "my-bucket",
Delimiter: "",
};
let getS3Files = () => {
let files = [];
s3.listObjectsV2(params, function (err, data) {
if (data) {
data.Contents.forEach((file) => {
files.push({
fileName: file.Key,
fileDate: file.LastModified,
});
});
console.log(files);
}
});
console.log(files);
if (files.length > 0) {
files = files.sort((a, b) => b.fileDate - a.fileDate);
console.log(files);
}
return files;
};
getS3Files();
答案 0 :(得分:1)
这是因为您没有等到s3.listObjectsV2
完成其数据提取。尽管s3.listObjectsV2
似乎不是一个函数,您应该等待它完成,但是它需要一些时间来向s3
发送请求并获取您请求的数据。
在您提供的代码中,第二个console.log
最有可能在第一个console.log
之前执行,到那时您将没有任何数据推送到files
。因此它将打印[]
。并且在第三个日志之前,它正在检查您的files
中是否有任何元素,这些元素自false
起再次等于files = []
。
因此,您需要将其包装在Promise周围,并等待其完成。
let getS3Files = async () => {
let files = [];
await new Promise(function (resolve, reject) {
s3.listObjectsV2(params, function (err, data) {
if (data) {
data.Contents.forEach((file) => {
files.push({
fileName: file.Key,
fileDate: file.LastModified,
});
});
console.log(files);
resolve();
} else {
reject(err);
}
});
});
console.log(files);
if (files.length > 0) {
files = files.sort((a, b) => b.fileDate - a.fileDate);
console.log(files);
}
return files;
};
await getS3Files();
答案 1 :(得分:0)
我不熟悉s3 api,但是我知道listObjectsV2
是一个异步操作,因此 files
将为空,因为它发生在异步调用之外并且在拥有值之前被执行>
请尝试
let AWS = require("aws-sdk");
AWS.config.update({
accessKeyId: process.env.VUE_APP_ACCESS_KEY,
secretAccessKey: process.env.VUE_APP_ACCESS_KEY,
region: "us-east-1",
});
let s3 = new AWS.S3();
let params = {
Bucket: "my-bucket",
Delimiter: "",
};
let getS3Files = (callback) => {
s3.listObjectsV2(params, function (err, data) {
callback(data);
});
};
getS3Files((data) => {
const files = data.Contents.map((file) => ({
fileName: file.key,
fileDate: file.LastModified,
})).sort((a, b) => b.fileDate - a.fileDate);
return files;
});
在这种情况下,getS3Files
会收到一个回调,其中包含将在函数调用中处理的数据。
看看这个问题How do I return the response from an asynchronous call?