title: How to upload file using multer or body-parser
body: <p>I am a NodeJS beginner, following along a book "Web Development with MongoDB and NodeJS". I am stuck at its chapter 6 with 'multer'. When I use multer for file uploads the server throws the following error: </p>
  
  <pre><code>/Users/fk / Documents / imageuploader / node_modules / express / lib / application.js: 209
  throw new TypeError('app.use() requires middleware functions'); ^
  
  TypeError: app.use() requires middleware functions
  </code></pre>
  
  <p>but when I replace it with bodyParser the server fires up but when I click the upload button it gives me the following error on the browser.</p>
  
  <pre><code>500 TypeError: Cannot read property 'file' of undefined
  </code></pre>
  
  <p>However, it is supposed to redirect me towards another page, where the uploaded file is shown.  </p>
  
  <p>Here is my bodyParser code, please see if I am using it correctly because it gives me "body-parser deprecated" at the starting of the server. I've seen other questions like mine and I followed but none of them really work. </p>
  
  <pre><code>app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({
    extended: true
  }));
  
  app.use(bodyParser({
    uploadDir: path.join(__dirname, '../public/upload/temp')
  }));
  </code></pre>
  
  <p>Following code shows how I use multer, just in case if there is something I shouldn't be doing please let me know. Which one would be better in case of uploading files, body-parser or multer? </p>
  
  <pre><code>app.use(multer({
    dest: path.join(__dirname, '../public/upload/temp')
  }));
  
  
  var saveImage = function() {
    var possible = 'abcdefghijklmnopqrstuvwxyz0123456789',
      imgUrl = '';
  
    for (var i = 0; i &lt; 6; i += 1) {
      imgUrl += possible.charAt(Math.floor(Math.random() * possible.length));
    }
  
    var tempPath = req.files.file.path,
      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();
  </code></pre>
  
  <p>Preceding block of code is the logic that I am using to upload the file. In the error it is referring to 'file' as undefined which is in the following line in the saveImage function. It is unable to get the path and therefore throws error 500 according to the else part of the saveImage function. Why is 'file' undefined here? I dont get it. </p>
  
  <pre><code>var tempPath = req.files.file.path,
  </code></pre>