2017-04-15 3 views
0

J'essaie de nettoyer mes contrôleurs en modulant mes fonctions de module multer, ce qui me permet de télécharger plusieurs fichiers avec mes formulaires. Le code actuel présenté ci-dessous fonctionne, mais je veux mettre la fonction multer dans un nouveau fichier. Je supposais que simplement prendre la fonction et l'exporter à partir d'un autre fichier fonctionnerait, mais pour une raison quelconque, je frappe un délai lors de mon formulaire POST, malgré l'appel au console.log au début du code multer. Il semble que quelque chose dans ce code arrête le processus, mais aucun message d'erreur n'est lancé. Est-ce que quelqu'un voit ce qui pourrait causer l'erreur?Modularizing Multer Functionality Problème

Multer appelée dans le fichier d'itinéraire:

var aws = require('aws-sdk'); 
var multer = require('multer'); 
var multerS3 = require('multer-s3'); 
var moment = require('moment'); 

var uploadDate = new moment().format("YYYY-MM-DD"); 
var s3 = new aws.S3(); 
var options = { 
    Bucket: process.env.AWS_BUCKET, 
    Expires: 60 
}; 

if(app.get('env') === 'production' || app.get('env') === 'staging'){ 
    options.ACL = 'private' 
} else { 
    options.ACL = 'public-read' 
}; 

//////////Multer code being called 

var upload = multer({ 
    storage: multerS3({ 
     s3: s3, 
     bucket: options.Bucket, 
     contentType: multerS3.AUTO_CONTENT_TYPE, 
     acl: options.ACL, 
     key: function(req, file, cb){ 
      var fileNameFormatted = file.originalname.replace(/\s+/g, '-').toLowerCase(); 
      cb(null, req.session.organizationId + '/' + uploadDate + '/' + fileNameFormatted); 
     } 
    }), 
    fileFilter: function(req, file, cb){ 
     if(!file.originalname.match(/\.(jpg|jpeg|png|gif|csv|xls|xlsb|xlsm|xlsx)$/)){ 
      return cb('One of your selected files is not supported', false); 
     } 
     cb(null, true); 
    } 
}).array('fileUpload', 5); 

///////Post route calling multer and rest of form submission 

.post(function(req, res){ 

    upload(req, res, function(){ 
     if(err){ 
      console.log('Multer upload error'); 
      req.flash('error', err); 
      res.redirect(req.get('referer')); 
      return; 
     } 

     ... MORE CODE ... 
    }) 
}); 

/controllers/multer.js, qui contient le code multer:

var express = require('express'); 
var app = express(); 
var aws = require('aws-sdk'); 
var multer = require('multer'); 
var multerS3 = require('multer-s3'); 
var moment = require('moment'); 

var s3 = new aws.S3(); 
var uploadDate = new moment().format("YYYY-MM-DD"); 

var options = { 
    Bucket: process.env.AWS_BUCKET, 
    Expires: 60, 
    //ContentType: req.query.file_type 
}; 

if(app.get('env') === 'production' || app.get('env') === 'staging'){ 
    options.ACL = 'private' 
} else { 
    options.ACL = 'public-read' 
}; 

module.exports = { 

    //Annotation file upload 
    annotationFileUpload: function(){ 
     multer({ 
      storage: multerS3({ 
       s3: s3, 
       bucket: options.Bucket, 
       contentType: multerS3.AUTO_CONTENT_TYPE, 
       acl: options.ACL, 
       key: function(req, file, cb){ 
        console.log("key called"); 
        var fileNameFormatted = file.originalname.replace(/\s+/g, '-').toLowerCase(); 
        cb(null, req.session.organizationId + '/' + uploadDate + '/' + fileNameFormatted); 
       } 
      }), 
      fileFilter: function(req, file, cb){ 
       console.log("file filter called"); 
       if(!file.originalname.match(/\.(jpg|jpeg|png|gif|csv|xls|xlsb|xlsm|xlsx)$/)){ 
        return cb('One of your selected files is not supported', false); 
       } 
       cb(null, true); 
      } 
     }).array('fileUpload', 5); 
    } 
} 

Importation /controller/multer et appelant la route:

var multerFile = require('./components/multer'); 

    .post(function(req, res){ 

    multerFile.annotationFileUpload(req, res, function(err){ 
       if(err){ 
        console.log('Multer upload error'); 
        req.flash('error', err); 
        res.redirect(req.get('referer')); 
        return; 
       } 
      ....MORE CODE.... 
     }) 
    }); 

Répondre

1

Vous devez vous débarrasser de la fonction wrapper car multer() renvoie la fonction middleware elle-même. La raison en est que vous appelez une fonction qui crée simplement le middleware et le supprime immédiatement, puis ne fait rien d'autre (comme répondre à la requête).

changer donc ceci:

annotationFileUpload: function(){ 
    multer({ 
     // ... 
    }).array('fileUpload', 5); 
} 

à ceci:

annotationFileUpload: multer({ 
    // ... 
}).array('fileUpload', 5) 
+0

Merci pour ce grand @mscdex catch! Je vous en suis reconnaissant! – cphill