2016-05-31 2 views
0

У меня возникли проблемы, пытаясь выяснить, как предотвратить загрузку Мультера файла, если запись уже добавлена ​​в базу данных.Разбирайте данные мультипартийной формы, а затем загрузите файл с помощью модуля Multer (Node)

В моем сценарии у меня есть многостраничная форма, где вы можете добавить пиво, определяющее идентификатор. Он имеет 2 входа, один с текстовым вводом (id) и другой с файловым вводом (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 есть функция, называемая файловым фильтром, где вы можете контролировать, какие файлы принимаются. Здесь я смог выполнить желаемый запрос, чтобы проверить, существует ли запись.

0

Вы должны загрузить файл перед тестированием, если он существует. А затем сохраните его или отпустите его

+0

Это единственное решение, создающее временный файл? – Emi

+0

Это безопасность для пользователей. Вы не можете получить доступ к файлу на стороне клиента. – Martial

+0

Node.js запускается на сервере, и там есть где я хочу проверить, существует ли запись до ее сохранения. – Emi

 Смежные вопросы

  • Нет связанных вопросов^_^