2016-11-12 104 views
0

我創建了下面的代碼,但是我似乎無法弄清楚如何更新圖片,如果findOneAndUpdate找到結果並且看起來好像result.save在put_form_url之前被執行。我如何實現這樣一個功能,如果它存在它將更新所有屬性並將新圖像上傳到s3,否則它將創建一個帶有s3上傳的新對象。if exists update else插入圖片上傳

router.post('/:id/:name/:birth/:country/:image', function(req, res, next) { 

var params = req.params; 
var accessHeader = req.headers; 

process.env.AWS_ACCESS_KEY_ID='' 
process.env.AWS_SECRET_ACCESS_KEY='' 
AWS.config.region = 'eu-west-1'; 
var s3 = new AWS.S3(); 


User.findOneAndUpdate({"_id": params.id}, {$set:{"name": params.name, "birthday": params.birth, "country": params.country}}, {new: true}, function(error, result) { 
    if (!error) { 
     // If the document doesn't exist 
     if (!result) { 
      // Create it 

      put_from_url(params.image, new Date().toString, function(err, res) { 

      result = new User({ 
       _id: params.id, 
       name: params.name, 
       birthday: new Date(params.birth), 
       country: params.country, 
       image: "url" + params.id 
      }); 
      }); 


     } 
     // Save the document 
     result.save(function(error) { 
      if (!error) { 
       res.json({ message: 'User created!' }); 
      } else { 
       res.send(err); 
      } 
     }); 
    } 
    }); 




}); 

上傳功能

function put_from_url(url, key, callback) { 
    request({ 
     url: url, 
     encoding: null 
    }, function(err, res, body) { 
     if (err) 
      return callback(err, res); 

     uploader.putObject({ 
      Bucket: "", 
      Key: "/" + key, 
      ContentType: res.headers['content-type'], 
      ContentLength: res.headers['content-length'], 
      Body: body // buffer 
     }, callback); 
    }) 
} 

回答

0

好吧,看來你有問題的兩個部分。

  1. 如何在沒有用戶的情況下實現圖像存儲,如果已有用戶則更新圖像。

因此,無論哪種情況,您都必須存儲圖像,爲什麼不先做更新圖像,然後更新/插入用戶或反之亦然。我個人會選擇前者。

router.post('/:id/:name/:birth/:country/:image', function(req, res, next) { 

var params = req.params; 
var accessHeader = req.headers; 

process.env.AWS_ACCESS_KEY_ID='' 
process.env.AWS_SECRET_ACCESS_KEY='' 
AWS.config.region = 'eu-west-1'; 
var s3 = new AWS.S3(); 

    put_from_url(params.image, params.id, function(err, res) { 

      result = new User({ 
       _id: params.id, 
       name: params.name, 
       birthday: new Date(params.birth), 
       country: params.country, 
       image: "url" + params.id 
      }); 
      // Save the document 
      result.save(function(error) { 
       if (!error) { 
        res.json({ message: 'User created!' }); 
       } else { 
        res.send(err); 
       } 
      }); 
      }); 

一些注意事項是,關鍵你使用的日期,但我只是用ID,以便它可以用新的圖像後進行更新。 s3對象可以被獨特的鍵使用和更新。如果你想做一些像保留一箇舊的圖像副本,你最好使用像params.id/(new Date().toString)這樣的密鑰,所以舊的圖像不會被覆蓋

其次,保存功能固有更新,如果對象是在那裏基於_id否則它會創建一個新的一。

  • 好像result.save正在put_form_url
  • 之前執行它肯定會,JavaScript是固有異步這意味着如果一個碼的處理時間過長,它會執行下一個語句。當你打電話給s3時,它的一個I/O調用會嘗試將圖像上傳到s3並且將被處理,同時你的下一行代碼將會被執行。

    有兩種方法。在先前呼叫的回叫中,將下一個呼叫包裝起來。並且使用承諾要好得多。

    承諾有幾分未來的事件,你可以告訴上傳到S3 然後保存到數據庫中。

    承諾有一點學習曲線,但它很好,乾淨,真的很有幫助。 q就是這樣的一個承諾模塊。