2016-05-31 10 views
0

Ich habe Probleme, herauszufinden, wie verhindert werden kann, dass Multer eine Datei hochlädt, wenn bereits ein Eintrag zur Datenbank hinzugefügt wurde.Mehrteilige Formulardaten analysieren und dann eine Datei mit Multer hochladen (Knotenmodul)

In meinem Szenario habe ich ein mehrteiliges Formular, wo Sie Biere mit einer ID hinzufügen können. Es hat 2 Eingänge, einen mit einer Texteingabe (id) und einen weiteren mit einer Dateieingabe (bierImage).

Ich möchte vor dem Hochladen einer Datei prüfen, ob sie bereits in der Datenbank vorhanden ist und, falls nicht, die Datei hochladen. Momentan lädt mein Code die Datei zuerst hoch und prüft dann, ob sie existiert, und das ist eine schlechte Sache!

, dass mein Code ist:

var express = require('express'); 
var router = express.Router(); 
var multer = require('multer'); 
var database = require('../services/database'); 

var upload = multer({ dest: 'uploads/' }); 
var cpUpload = upload.fields([{ name: 'beerImage', maxCount: 1 } ]); 

router.route('/beers') 
    .post(function (req, res, next) { 
     // I'd like to use req.body.id in the query here, but it doesn't exist yet! 
     cpUpload(req, res, function (err) { 
      if (err) { 
       return next(new Error('Error uploading file: ' + err.message + ' (' + err.field + ')')); 
      } else { 
       database.getConnection().done(function (conn) { 
        conn.query('SELECT COUNT(*) AS beersCount FROM beers WHERE id=?', req.body.id, function (err, rows, fields) { 
         if (err) { 
          conn.release(); 
          return next(err); 
         } 

         if (rows[0].beersCount > 0) { 
          conn.release(); 
          return next(new Error('Beer "' + req.body.id + '" already exists!')); 
         } else { 
          delete req.body.beerImage; 
          conn.query('INSERT INTO beers SET ?', req.body, function (err, rows, fields) { 
           conn.release(); 

           if (err) { 
            return next(err); 
           } 

           res.json({ message: 'Beer "' + req.body.id + '" added!' }); 
          }); 
         } 
        }); 
       }); 
      } 
     }); 
    }); 

module.exports = router; 

ich keine Möglichkeit, zunächst die mehrteiliger Datenform „Parse“ finden (in der Lage sein, um die Abfrage zu tun, und überprüfen, ob es req.body.id mit existiert) und dann entscheiden, ob ich die Datei hochladen möchte oder nicht. Es scheint, dass "cpUpload" beide Dinge gleichzeitig tut!

Irgendeine Idee, wie man "req.body.id" zuerst (um die Abfrage zu tun) und dann entscheiden, ob ich die Datei hochladen möchte?

Antwort

0

Ich erkannte, dass es eine Funktion namens "filefilter" auf Multer, wo Sie steuern können, welche Dateien akzeptiert werden. Hier konnte ich die gewünschte Abfrage durchführen, um zu prüfen, ob der Eintrag existiert.

0

Sie müssen die Datei vor dem Test hochladen, wenn sie existiert. Und dann speichern Sie es oder lassen Sie es

+0

Ist dies die einzige Lösung, erstellen Sie eine temporäre Datei? – Emi

+0

Dies ist eine Sicherheit für Benutzer. Sie können nicht auf die Client-Seite zugreifen. – Martial

+0

Node.js läuft auf dem Server und es ist dort, wo ich überprüfen möchte, ob der Eintrag vorhanden ist, bevor Sie es speichern. – Emi