2016-02-03 29 views
5

Ich lerne nur node.js und habe Schwierigkeiten, einen einfachen Dateiupload mit Express und multer zu machen. HierNode.js TypeError: Kann Eigenschaft 'Datei' von undefined nicht lesen

ist die Form:

Bild hochladen

In meinem configure.js ich habe:

app.use(express.static(path.join(__dirname, 'public'))); 
app.use(multer({dest:'../public/upload/temp'}).single('file')); 

Und die image.js Controller:

create: function(req, res) { 
     var saveImage = function() { 
      console.log(req.body); 
      var possible = 'abcdefghijklmnopqrstuvwxyz', 
       imgUrl = ''; 

      for(var i=0; i < 6; i+=1) { 
       imgUrl += possible.charAt(Math.floor(Math.random() * possible.length)); 
      } 

      var tempPath = req.files.file.path, //<line 55 error 
       ext = path.extname(req.files.file.name).toLowerCase(), 
       targetPath = path.resolve('./public/upload/' + imgUrl + ext); 

      if (ext === '.png' || ext === '.jpg' || ext === '.jpeg' || ext === '.gif') { 


       fs.rename(tempPath, targetPath, function(err) { 
        if (err) throw err; 

        res.redirect('/images/' + imgUrl); 
       }); 
      } else { 
       fs.unlink(tempPath, function() { 
        if (err) throw err; 

        res.json(500, {error: 'Only image files are allowed.'}); 
       }); 
      } 
     }; 

     saveImage(); 
    }, 

Jedoch habe ich diesen Fehler, wenn ich versuche, ein Bild hochladen:

TypeError: Cannot read property 'file' of undefined 
    at saveImage (/home/pc/node-dev/test-proj/controllers/image.js:55:37) 
    at module.exports.create (/home/pc/node-dev/test-proj/controllers/image.js:76:9) 
    at Layer.handle [as handle_request] (/home/pc/node-dev/test-proj/node_modules/express/lib/router/layer.js:95:5) 
    at next (/home/pc/node-dev/test-proj/node_modules/express/lib/router/route.js:131:13) 
    at Route.dispatch (/home/pc/node-dev/test-proj/node_modules/express/lib/router/route.js:112:3) 
    at Layer.handle [as handle_request] (/home/pc/node-dev/test-proj/node_modules/express/lib/router/layer.js:95:5) 
    at /home/pc/node-dev/test-proj/node_modules/express/lib/router/index.js:277:22 
    at Function.process_params (/home/pc/node-dev/test-proj/node_modules/express/lib/router/index.js:330:12) 
    at next (/home/pc/node-dev/test-proj/node_modules/express/lib/router/index.js:271:10) 
    at urlencodedParser (/home/pc/node-dev/test-proj/node_modules/body-parser/lib/types/urlencoded.js:95:37) 

Und wenn ich log das req Objekt ist file nicht da:

{ title: 'myimage', description: 'something' } 

Eigentlich ist das Snippet nur eine leicht modifizierte Version, die ich in this book gelesen habe, die veralteten Express-3 verwendet. Also im Grunde habe ich es nur mit dem multer Teil aktualisiert.

Ich frage mich, was hier falsch ist und wie es zu beheben ist.

+0

Haben Sie jemals eine praktikable Lösung mit Multer gefunden? Ich habe den unten aufgeführten Fix ausprobiert und es in req.file und req.path zu ändern scheint zu funktionieren, aber jetzt leitet das Beispiel aus dem Buch auf die/image/route um, ohne die Datei erfolgreich zu benennen oder zu empfangen. – Dave

+0

Sie var tempPath = req.file.path; var ext = Pfad.Extname (req.file.originalname) .toLowerCase(); var targetPath = pfad.resolve ('./ public/upload /' + imgUrl + ext); – iansari

Antwort

9

Sie verwenden upload.single, die Sie verwenden sollten req.file nicht req.files. Verwenden Sie zum Hochladen mehrerer Dateien upload.array.

Beachten Sie, dass Sie kein weiteres .file nach req.file benötigen. req.file ist die hochgeladene Datei, wenn Sie upload.single verwenden.

+0

Danke für den Tipp. Aber jetzt, da ich 'tempPath = req.file.file.path 'verwende, verursache ich' TypeError: Kann die Eigenschaft' path 'von undefined' Fehler nicht lesen. Irgendwelche Ideen? – qliq

+1

@qliq [wie im Dokument angegeben] (https://www.npmjs.com/package/multer#singlefieldname), müssen Sie nur 'req.file.path', nicht' req.file.file.path' verwenden . (Aus dem Dokument: Die einzelne Datei wird in 'req.file' gespeichert.) – maowtm

+0

kurz und klar..danke Kumpel – Jana

Verwandte Themen