2015-07-18 6 views
9

Sto provando a configurare multer nel mio file app.js (utilizzando node.js/express) per consentire agli utenti di caricare immagini. Ho il seguente codice nel app.js:configurazione multer con restituisce l'app.use TypeError

//various require statements for passport, cookie parser, etc.. 

var multer = require('multer'); 

var app = express(); 

app.use(multer({dest:'./uploads/'})); 

Quando provo a fare funzionare l'app ottengo TypeError: app.use() requires middleware functions

Capisco che questa domanda possono richiedere un po 'di contesto per quanto riguarda la mia app quindi per favore fatemelo sapere se sono necessarie ulteriori informazioni.

Grazie

EDIT: Altro codice app.js:

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var bodyParser = require('body-parser'); 
var methodOverride = require('method-override'); 
var session = require('express-session'); 
//var fs = require('fs'); 
var multer = require('multer'); 

//Mongo Database 
var mongo = require('mongodb'); 
var monk = require('monk'); 
var db = monk('localhost:27017/test-api'); 

//Instagram-API 
var api = require('instagram-node').instagram(); 

//Cookie Manager 
var cookieParser = require('cookie-parser'); 

//Grid 
//var Grid = require('gridfs-stream'); 

//Passport 
var passport = require('passport'); 
var InstagramStrategy = require('passport-instagram').Strategy; 

var routes = require('./routes/index'); 
//var users = require('./routes/users'); 

var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(__dirname + '/public/favicon.ico')); 
app.use(logger('dev')); 
app.use(multer({dest:'./uploads/'})); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(methodOverride()); 
app.use(session({secret: 'keyboard cat', resave: false, saveUninitialized: true })); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(express.static(path.join(__dirname, 'public'))); 


// Make our db accessible to our router 
app.use(function(req,res,next){ 
    req.db = db; 
    next(); 
}); 

app.use('/', routes); 
+0

sparo nel buio, ma fa la variabile multer avere il valore corretto dopo lo richiedono? (ci sono linee che toccano multer che hai omesso dal tuo campione?) Che versioni di pacciamatura ed espresso stai usando? – doldt

+0

Per quanto posso dire non ci sono linee che si riferiscono a multer oltre a quelle che ho postato. Sto usando express 4.12.4 e multer 1.0.0 (credo lol, ho preso queste versioni da package.json). Permettetemi di modificare la mia domanda con altro codice – prcbass

risposta

16

Il problema è che multer({dest:'./uploads/'}) oggetto di ritorno, non la funzione middleware. E se guardiamo al modulo di codice che vedremo che ci sono tre funzioni di middlware:

multer({dest:'./uploads/'}).single(...) 
multer({dest:'./uploads/'}).array(...) 
multer({dest:'./uploads/'}).fields(...) 

Provare uno di loro.

+4

Ok, sono un po 'confuso sul motivo per cui la pagina di npm ha qualcosa di simile al mio codice nel loro esempio. https://www.npmjs.com/package/multer Devo usare una delle funzioni che hai elencato sopra? – prcbass

+0

Aspetta, sembra che la pagina che ho collegato sia stata aggiornata di recente e non ho aggiornato la pagina. Potresti fornire un esempio di uso corretto di 'multer ({dest: './ uploads /'})' – prcbass

+1

Stranamente, potrebbe essere una documentazione obsoleta? O mi sbaglio. Comunque. Ad esempio: 'app.use (multer ({dest: './ uploads /'}). Single ('foto'));' - consente di caricare un singolo file con modulo fieldName 'foto'. –

8

Il credito va a @ stdob-- per guidarmi nella giusta direzione. La documentazione di multer che stavo guardando sembra essere stata aggiornata mentre stavo lavorando e quindi stavo usando il codice in modo errato.

Multer deve essere utilizzato con le sue funzioni di middleware. Di conseguenza, il modo corretto di usare questo pacchetto è la seguente:

var multer = require('multer'); 

var upload = multer({dest:'uploads/'}); 

var cpUpload = upload.single('postImg'); 

router.post('/createpost', cpUpload, function(req,res){ 

    console.log(req.file); 
    res.redirect('/'); 

} 

Questo frammento di codice creerà un itinerario postale per '/ createpost' e sarà caricare un unico documento (dal nome del modulo 'postImg') per/uploads nel server. req.file contiene il JSON con le informazioni sul file (come il percorso del file). Tieni presente che questo non eliminerà automaticamente il file caricato.

Maggiori informazioni possono essere trovate qui: https://www.npmjs.com/package/multer

3

questo farà

app.use(multer({dest:'./public/images/uploads'}).any());