2015-07-18 6 views
9

Ich versuche multer in meiner app.js-Datei (mit node.js/express) zu konfigurieren, damit Benutzer Bilder hochladen können. Ich habe den folgenden Code in app.js:Multer-Konfiguration mit app.use gibt TypeError zurück

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

var multer = require('multer'); 

var app = express(); 

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

Wenn ich versuche, die app I TypeError: app.use() requires middleware functions

ich, dass diese Fragen zu verstehen bekommen ausführen kann etwas mehr Kontext in Bezug auf meine Anwendung erfordert also bitte lassen Sie mich wissen, ob zusätzliche Informationen benötigt werden.

Danke

EDIT: Mehr Code aus 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

Schuss im Dunkeln tun, aber nicht die multer Variable haben den richtigen Wert, nachdem Sie es benötigen? (Gibt es Linien, die Multer berühren, die Sie in Ihrer Probe weggelassen haben?) Welche Multer- und Express-Versionen verwenden Sie? – doldt

+0

Soweit ich sagen kann, gibt es keine Zeilen, die Multer neben denen, die ich gepostet habe, beziehen. Ich benutze Express 4.12.4 und Multer 1.0.0 (ich glaube, lol, habe diese Versionen von package.json). Lassen Sie mich meine Frage mit mehr Code bearbeiten – prcbass

Antwort

16

Problem ist, dass multer({dest:'./uploads/'}) Rückgabeobjekt, nicht-Middleware-Funktion. Und wenn wir auf den Code-Modul sehen, dass wir sehen, dass es drei middlware Funktionen:

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

Versuchen einer von ihnen.

+4

Ok, ich bin etwas verwirrt, warum die Npm-Seite etwas ähnliches zu meinem Code in ihrem Beispiel hat. https://www.npmjs.com/package/multer Soll ich eine der oben aufgeführten Funktionen verwenden? – prcbass

+0

Warten Sie, es scheint, dass die Seite, die ich verlinkt habe, kürzlich aktualisiert wurde und ich die Seite nicht aktualisiert habe. Könnten Sie ein Beispiel für die korrekte Verwendung von 'multer ({dest: './uploads/'}) geben? – prcbass

+1

Seltsamerweise kann es veraltete Dokumentation sein? Oder irre ich mich? Sowieso. Zum Beispiel: 'app.use (multer ({dest: './uploads /'}). Single ('foto'));' - erlauben Sie das Hochladen einzelner Dateien mit dem Formular fieldName 'photo'. –

8

Kredit geht an @ stdob-- für die Führung in die richtige Richtung. Die multilinguale Dokumentation, die ich mir angesehen habe, scheint während meiner Arbeit aktualisiert worden zu sein und deshalb habe ich den Code falsch benutzt.

Multer sollte mit seinen Middleware-Funktionen verwendet werden. Folglich ist der richtige Weg, um dieses Paket zu verwenden, ist wie folgt:

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('/'); 

} 

Diese Code-Schnipsel für ‚/ erstelleBeitrag‘ einen Beitrag Route erstellen und wird ein einzelnes Dokument (von der Form Namen ‚postImg‘) zu/uploads laden im Server. req.file enthält den JSON mit den Dateiinformationen (z. B. den Dateipfad). Beachten Sie, dass dadurch die hochgeladene Datei nicht automatisch gelöscht wird.

Weitere Informationen finden Sie hier: https://www.npmjs.com/package/multer

3

diese

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