2017-07-18 3 views
0

ここのコードは、マルチパート/フォームデータにアップロードされた画像(マルチパーティモジュールでファイルが正常に解析された画像)をAmazon S3に保存し、イメージバケットURLをmongodb内のimageUrl配列フィールドに保存します。ただし、imageUrlは常に空です。 loopwithcb関数内で、imageUrlに正しいURLがあることがわかりました。 afterSaveコールバック関数では、imageUrlは空です。私はそれが非同期問題だと思うが、まだそれを理解することはできません。どんな考えが役に立つでしょう。すべての画像がnodejsを使用してS3に保存された後、どのようにURLを取得できますか

//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(); 
} 
関連する問題