2017-06-14 9 views
0

I Formdata auf meine ausdrückliche App wie so schickte:Mungo - FindOne() innerhalb 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); 

}; 

Ich bin ein neues Element in meiner Mungo DB speichern. Jetzt funktioniert alles perfekt. Aber ich möchte Duplikate mit Mungo findOne() erkennen, und nicht nur Mongoose Handle erkennen lassen, wenn ein doppelter Schlüssel existiert, wenn Sie in die DB schreiben. Weil meine Bilder zu diesem Zeitpunkt hochgeladen werden, wenn ein doppelter Schlüssel existiert oder nicht. Weil es nur das Duplikat auf save()

das Problem jetzt, in meiner Express-App ist, wenn ich findOne() benutze, hat Multer() meine formData noch nicht entschlüsselt. ex:

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. 
     }); 

    }); 
}); 

ich die FindOne innerhalb der Upload nicht tun können, weil dann die Dateien sowieso und dann nur ein Duplikat erkennen hochgeladen werden.

Ich versuchte eine andere multer().any() Funktion zum Abrufen der FormData direkt nach der .post(), aber das schien nicht zu funktionieren. Ich glaube nicht, ich kann dies tun:

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. 
     }); 

}) 

Es ist nicht zu mögen scheint mir in einer multer Funktion eine multer Funktion.

Irgendwelche Ratschläge?

+1

Sie [Dateifilter] (https://github.com/expressjs/multer#filefilter) und prüfen Sie nach Duplikaten dort zu verwenden Versuchen? – rkm

+0

Nein, ich habe es noch nicht ausprobiert. Ich werde mich schnell umsehen. Vielen Dank. –

+0

@rkm, ich muss Dubletten in der DB finden, Dateifilter prüft nur auf doppelte Felder in den aktuellen Daten. –

Antwort

1

Sie fileFilter Option können Sie steuern, welche Dateien akzeptiert werden.

Es könnte so etwas wie diese:

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

Danke. FileFilter hat den Trick für mich gemacht. Das einzige Problem, mit dem ich Probleme hatte, war, dass ich bei der Verwendung von fileFilter sicherstellte, dass ich die Felder passierte, bevor ich die Dateien beim Anhängen meiner formData übergab. Danach perfekt! –

0

Man könnte sie in zwei Middle trennen

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

Awesome Dank, das sieht wirklich gut aus. Wird implementieren und Sie wissen lassen. –

+0

Das Problem ist, dass ich nur Umfang von req.body.whatever innerhalb meiner upload() - Funktion habe. Daher wird Vehicle.findOne() immer undefiniert zurückgegeben. –