2017-06-14 118 views
0

我送FORMDATA我明確的應用程序,像這樣:貓鼬 - FindOne()內Multer

itemFactory.saveItem = function(item, callback){ 

    var formData = new FormData(); 

    for(var i = 0; i < item.photos.length; i++){ 
     formData.append('photos', item.photos[i]); 
    }  
    for(var key in item){ 
     formData.append(key, item[key])  
    } 

    return $http.post('/api/item/', formData, { 
     transformRequest: angular.identity, 
     headers: { 'Content-Type': undefined } 
    }).success(callback); 

}; 

我保存到我的貓鼬DB的新項目。現在一切都運轉良好。但是我想使用mongoose findOne()來檢測重複項,而不僅僅是讓mongoose處理檢測寫入數據庫時​​是否存在重複密鑰。因爲無論在這個階段我的圖片都會上傳,如果有重複的密鑰存在或不存在。因爲它只檢測到save()

現在的問題,在我的快車應用程序中,當我使用findOne()時,Multer()尚未解碼我的formData。例如:

router.post('/item', function(req, res){ 
    Vehicle.findOne({ id: String(req.body.id) }, function(error, item){ 

     var storage = multer.diskStorage({...}) 
     var upload = multer({ 
         storage: storage 
        }).any(); 

     upload(req, res, function(error){ 
      //formData is only available here via req.body 
      //and not at findOne() stage. 
     }); 

    }); 
}); 

我不能做findOne上傳裏面,因爲這樣的文件將被上傳無論如何,然後只檢測一個副本。

我嘗試了另一個multer().any()函數獲取formData剛好在.post()後但似乎沒有工作。我不認爲我能做到這一點:

var detectItem = multer().any() 
detectItem(req, res, function(){ 

    Vehicle.findOne({ id: String(req.body.id) }, function(error, item){ 

     var storage = multer.diskStorage({...}) 
     var upload = multer({ 
         storage: storage 
        }).any(); 

     upload(req, res, function(error){ 
      //formData is only available here via req.body 
      //and not at findOne() stage. 
     }); 

}) 

它似乎並不喜歡我在一個multer函數內使用一個multer函數。

有什麼建議嗎?

+1

你嘗試使用[文件過濾器(https://github.com/expressjs/multer#filefilter)和重複檢查呢? – rkm

+0

不,我還沒有嘗試過。我很快會去看看。謝謝。 –

+0

@rkm,我需要在數據庫中找到重複項,文件篩選器只檢查當前數據中的重複字段。 –

回答

1

您可以使用fileFilter選項來控制哪些文件被接受。

這可能是這樣的:

function filFilter (req, file, cb) { 
    Vehicle 
     .findOne({ id: req.body.id }) 
     .then(item => { 
      cb(null, !item); // Skip if item exists (passing false skips file) 
     }) 
} 
+0

謝謝。 fileFilter爲我做了詭計。我唯一遇到的問題是使用fileFilter的時候,在追加我的formData時,確保在傳遞文件之前傳遞了字段。之後,完美! –

0

你可以將它們分開成兩個中間件

app.post('/item', function(req, res, next){ 

    //this middleware is used to check duplicate 

    Vehicle.findOne({id:req.body.id}).then(function(item){ 
     if(item) res.end() //if item existed, send response directly 
     else next() //if item not existed, continue to next middleware 
    }) 

}, function(req, res){ 

    var storage = multer.diskStorage({...}) 
    var upload = multer({ storage: storage }).any(); 

    upload(req, res, function(error){ 
     // ... 
    }); 

}) 
+0

非常感謝,這實際上看起來不錯。將執行並讓你知道。 –

+0

問題是,我的upload()函數中仍然只有req.body.whatever的範圍。所以Vehicle.findOne()總是會返回undefined。 –