2016-05-31 10 views
0

すでにデータベースにエントリが追加されている場合、Multerがファイルをアップロードするのを防ぐ方法を理解しようとしています。マルチパートフォームのデータを解析して、Multer(ノードモジュール)を使ってファイルをアップロードします。

私のシナリオでは、IDを指定してビールを追加できるマルチパートフォームがあります。 2つの入力があり、1つはテキスト入力(id)ともう1つはファイル入力(beerImage)です。

私がしたいのは、ファイルをアップロードする前に、それがデータベースにすでに存在するかどうかをチェックし、そうでなければファイルをアップロードすることです。現在、私のコードはファイルを最初にアップロードし、それが存在するかどうかをチェックしています。それは悪いことです!

私のコードです:

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; 

私が最初にクエリを実行し、それがreq.body.idを使用して存在しているかどうかを確認できるようにする(マルチパートフォームデータを「解析」への道を見つけることができません)ファイルをアップロードするかどうかを決定します。それは "cpUpload"は両方のことを同時に行うようです!

「req.body.id」を最初に取得して(質問を実行する)どのようにファイルをアップロードするかを決める考え方はありますか?

答えて

0

私は、ファイルを受け入れることを制御できるMulterに "fileFilter"と呼ばれる機能があることを認識しました。ここでは、エントリが存在するかどうかを確認するために必要なクエリを実行できました。

0

ファイルが存在する場合は、テストする前にアップロードする必要があります。そしてそれを保存するか、またはそれを落とす

+0

これは唯一の解決策ですか、一時ファイルを作成しますか? – Emi

+0

これはユーザーのためのセキュリティです。クライアント側のファイルにアクセスすることはできません。 – Martial

+0

Node.jsはサーバ上で動作し、保存する前にそのエントリが存在するかどうか確認したいところです。 – Emi

関連する問題