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