2017-07-18 72 views
0

此處的代碼旨在將以multipart/form-data(文件已成功在多方模塊中解析的文件)上載的圖像保存到Amazon S3,然後獲取所有圖像圖像桶URL並將其保存到mongodb中的imageUrl數組字段。但是,imageUrl總是空的。 我發現在loopwithcb函數中imageUrl具有正確的URL。 在保存後的回調函數中,imageUrl爲空。我認爲這是異步的問題,但仍然無法弄清楚。任何想法都會有幫助。如何在使用nodejs在S3中保存所有圖像後獲取網址

//save images to S3 
var i=-1; 
var imageUrl =[]; 
function loopwithcb(afterSave){ 
    Object.keys(files.files).forEach(function(){ 
    i=i+1; 
    var myFile = files.files[i]; 
    var fileName = Date.now()+myFile.originalFilename; 
    s3Client.upload({ 
     Bucket: bucket, 
     Key: fileName, 
     ACL: 'public-read', 
     Body: fs.createReadStream(myFile.path) 
     //ContentLength: part.byteCount 
    }, function (err, data) { 
     if (err) { 
      //handle error 
     } else { 
      //handle upload complete 
      var s3url = "https://s3.amazonaws.com/" + bucket + '/' + fileName; 
      imageUrl.push(s3url); 
      console.log('imageurl:'+ imageUrl); 
      //delete the temp file 
      fs.unlink(myFile.path); 
      console.log('url:' + imageUrl);        
     } 
    }); 
    }); 
    afterSave(); 
} 
function afterSave(){ 
    console.log('i:'+ i); 
    console.log('outside print imageurl:'+ imageUrl); 
    Listing.create({ 
     title : fields.ltitle, 
     type : 'newlist', 
     description : fields.lbody, 
     image : imageUrl 
     }, function (err, small) { 
     if (err) return handleError(err); 
     // saved! 
     console.log(small); 
     console.log('listingId:' + ObjectId(small._id).valueOf()); 
     //res.json(small); 
    }); 
} 
loopwithcb(afterSave); //call back 

回答

0

改變了一些代碼的一部分,現在它可以打印出正確的IMAGEURL。但是,新代碼不會將文件上傳到AWS S3。發現這個解決方案(async for loop in node.js)正是我想要的。

function loopwithcb(afterSave){ 
    Object.keys(files.files).forEach(function(){ 
    i=i+1; 
    var myFile = files.files[i]; 
    var fileName = Date.now()+myFile.originalFilename; 
    var saved = s3Client.upload({ 
     Bucket: bucket, 
     Key: fileName, 
     ACL: 'public-read', 
     Body: fs.createReadStream(myFile.path) 
     //ContentLength: part.byteCount 
    });  
    if (saved.err) { 
     //handle error 
    } else { 
     //handle upload complete 
     var s3url = "https://s3.amazonaws.com/" + bucket + '/' + fileName; 
     imageUrl.push(s3url); 
     console.log('imageurl:'+ imageUrl); 
     //delete the temp file 
     fs.unlink(myFile.path); 
     console.log('url:' + imageUrl);        
    }  
    }); 
    afterSave(); 
} 
相關問題