javascript - 修改 s3.putObject 函数内的变量

标签 javascript node.js

我编写了以下代码来将文件上传到亚马逊 s3。

 var upload = async function() {

  var uploadURLs = []
  for (var i = 0; i < files.length; i++) {
    fs.readFile(filePath, (error, content) => {
      s3.putObject({
      Bucket: bucketName,
      Key: key,
      Body: content
    }, function(err, data){
  .....
  if (uploadCount == files.length - 1) {
  uploadURLs = allUrls;
  }
 }
}
return uploadURLs
}

代码工作正常,但返回的数组 uploadURLs 为空,而 allUrls 不为空。您知道如何解决这个问题吗?我引用这个post我看不出有任何理由说明这不起作用。

最佳答案

您正在返回一个尚未设置的变量(在您的情况下为 uploadURLs),因为您正在异步回调函数中设置它。为了使其正常工作,您应该等待操作完成后再返回它。声明如下:

var upload = async function() {

根本没有帮助。你应该这样做:

var upload = function() {
  return new Promise((success, fail) => {
    var uploadURLs = []
    for (var i = 0; i < files.length; i++) {
      fs.readFile(filePath, (error, content) => {
        if (error) {
          return fail(error);
        }
        s3.putObject({
          Bucket: bucketName,
          Key: key,
          Body: content
       }, function(err, data) {
         if (err) {
           return fail(err);
         }
         .....
         if (uploadCount == files.length - 1) {
           uploadURLs = allUrls;
           return success(uploadURLs);
         }
       }
     }
  });
}

实际上,在这种情况下,uploadURLs 可能完全没有必要。另一件事是,只有当您计划在异步函数中使用await时,才应该使用async。否则就浪费了。

关于javascript - 修改 s3.putObject 函数内的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49446196/

相关文章:

javascript - Bing map - 将平移限制在边界区域

javascript/jquery 获取变量的值

javascript - 当 Canvas 尺寸改变时需要帮助重新定位一个圆圈

node.js - 如何在 Node.js 中扩充和解码 XML?

javascript - 无法在 Node.js 中检索 Redis 中的值?

Node.js 测试 REST API

javascript - 搜索包含指定文本的 div

有 promise 的 Javascript (Angularjs) websocket?

javascript - 使用cheerio获取所有包含的js

node.js - 谷歌云构建-functions@: The engine "node" is incompatible with this module. 预期版本 "10"