Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

typeerror: app.use() requires middleware function

I am learning node.js with express template engine, I am following udemy course "learn node.js by building 10 projects", while following a lecture when professor run npm start localhost:3000 starts while mine pops up error indicating app.use requires middleware function I have tried matching code and its same. Please help me to resolve the error i have been stuck here for hours tried a lot of edits but its not working for me.

When I am trying to run 'npm start' following error pops up

TypeError: app.use() requires middleware functions

Here is app.js code:

var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var expressValidator = require('express-validator'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var bodyParser = require('body-parser'); var multer = require('multer'); var flash = require('connect-flash'); var mongo = require('mongodb'); var mongoose = require('mongoose'); var db = mongoose.connection;  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');  //Handle File Uploads app.use(multer({   dest: './uploads' }));  // uncomment after placing your favicon in /public //app.use(favicon(__dirname + '/public/favicon.ico')); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({   extended: false }));  //Handle Express Sessions app.use(session({   secret: 'secret',   saveUninitialied: true,   resave: true }));  //Passport app.use(passport.initialize()); app.use(passport.session());  //Validator app.use(expressValidator({   errorFormatter: function(param, msg, value) {     var namespace = param.split('.'),       root = namespace.shift(),       formParam = root;      while (namespace.length) {       formParam += '[' + namespace.shift() + ']';     }     return {       param: formParam,       msg: msg,       value: value     };   } }));  app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public')));  app.use(flash());  app.use(function(req, res, next) {   res.locals.messages = require('express-messages')(req, res);   next(); });  app.use('/', routes); app.use('/users', users);  // catch 404 and forward to error handler app.use(function(req, res, next) {   var err = new Error('Not Found');   err.status = 404;   next(err); });  // error handlers  // development error handler // will print stacktrace if (app.get('env') === 'development') {   app.use(function(err, req, res, next) {     res.status(err.status || 500);     res.render('error', {       message: err.message,       error: err     });   }); }  // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) {   res.status(err.status || 500);   res.render('error', {     message: err.message,     error: {}   }); });    module.exports = app; 

Here is package.json file

{   "name": "nodeauth",   "version": "1.0.0",   "private": true,   "scripts": {     "start": "node ./bin/www"   },   "dependencies": {     "body-parser": "~1.12.4",     "cookie-parser": "~1.3.5",     "debug": "~2.2.0",     "express": "~4.12.4",     "jade": "~1.9.2",     "morgan": "~1.5.3",     "serve-favicon": "~2.2.1",     "mongodb": "*",     "mongoose": "*",     "connect-flash": "*",     "express-validator": "*",     "express-session": "*",     "express-messages": "*",     "passport": "*",     "passport-local": "*",     "passport-http": "*",     "multer": "*"   } } 

Here is updated app.js (after removing multar)

var express          = require('express'),     path             = require('path'),     favicon          = require('serve-favicon'),     logger           = require('morgan'),     cookieParser     = require('cookie-parser'),     expressValidator = require('express-validator'),     session          = require('express-session'),     passport         = require('passport'),     LocalStrategy    = require('passport-local').Strategy,     bodyParser       = require('body-parser'),     flash            = require('connect-flash'),     mongo            = require('mongodb'),     mongoose         = require('mongoose'),      db = mongoose.connection,      routes = require('./routes/index'),     users  = require('./routes/users'),      app = express();  // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade');  // handle file uploads  //multer delted   // uncomment after placing your favicon in /public //app.use(favicon(__dirname + '/public/favicon.ico')); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false }));  // handle express sessions app.use(session({   secret: 'keyboard cat',   resave: true,   saveUninitialized: true }));  // passport app.use(passport.initialize()); app.use(passport.session());  // validator app.use(expressValidator({   errorFormatter: function(param, msg, value) {     var namespace = param.split('.'),         root      = namespace.shift(),         formParam = root;      while(namespace.length) {       formParam += '[' + namespace.shift() + ']';     }      return {       param: formParam,       msg  : msg,       value: value     };   } }));  app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public')));  // flash app.use(flash());  // express messages app.use(function(req, res, next) {   res.locals.messages = require('express-messages')(req, res);   next(); });  app.get('*', function(req, res, next) {   res.locals.user = req.user || null;   next(); });  app.use('/', routes); app.use('/users', users);  // catch 404 and forward to error handler app.use(function(req, res, next) {   var err = new Error('Not Found');   err.status = 404;   next(err); });  // error handlers  // development error handler // will print stacktrace if (app.get('env') === 'development') {   app.use(function(err, req, res, next) {     res.status(err.status || 500);     res.render('error', {       message: err.message,       error: err     });   }); }  // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) {   res.status(err.status || 500);   res.render('error', {     message: err.message,     error: {}   }); });   //Express server var http = require('http'); var server = http.createServer(app);  app.get('/', function(req, res) {     res.send("Hello World!"); });  server.listen(3000, 'localhost'); server.on('listening', function() {     console.log('Express server started on port %s at %s', server.address().port, server.address().address); });  module.exports = app; 

Thank You

like image 949
mean learner Avatar asked Jul 27 '15 14:07

mean learner


People also ask

What is middleware function?

Middleware functions are functions that have access to the request object (req), the response object (res), and the next middleware function in the application's request-response cycle. These functions are used to modify req and res objects for tasks like parsing request bodies, adding response headers, etc.

What is middleware in node JS?

The middleware in node. js is a function that will have all the access for requesting an object, responding to an object, and moving to the next middleware function in the application request-response cycle.

What is app use in node JS?

The app. use() method mounts or puts the specified middleware functions at the specified path. This middleware function will be executed only when the base of the requested path matches the defined path.


2 Answers

It worked in this way. delete this line,

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

and use it as,

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

I'm too following the same course

like image 95
Hasitha Prageeth Avatar answered Oct 05 '22 17:10

Hasitha Prageeth


Change:

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

For something like:

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

or

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

And be aware to have something like:

<form action="/postPhotos" enctype="multipart/form-data">     <input type="file" name="singleInputFileName">     <input type="submit" value="Upload photo"> </form> 

for the first case, or:

<form action="/postPhotos" enctype="multipart/form-data">     <input type="file" name="multiInputFileName" multiple>     <input type="submit" value="Upload photo"> </form> 

For the second one, in your html.

like image 26
Rubén Marrero Avatar answered Oct 05 '22 16:10

Rubén Marrero