1
votes

Hi guys im following a tutorial which seem outdated with the Multer Middleware.

First I had some problem which it broke down in consol but I fixed that by replacing file to var upload = multer({ dest: './uploads' });.

But now I get a problem when I try to register a user when filing the fields Issue Image. While the tutorial I follow just progress with an registered user.



IN APP.JS


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');
app.set('view cache', false);

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

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__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',
  saveUninitialized: true,
  resave:true
}));

//passport Should be after express middleware

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;

In user.js


var express = require('express');
var router = express.Router();


var User = require('../models/user');

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

/* GET users listing. */
router.get('/register', function(req, res, next) {
  res.render('register',{
      'title': 'Register'
  });
});

/* GET users listing. */
router.get('/login', function(req, res, next) {
  res.render('login',{
      'title': 'Login'
  });
});

router.post('/register', function(req, res, next){
  // Get form values
  var name = req.body.name;
  var email = req.body.email;
  var username = req.body.username;
  var password = req.body.password;
  var password2 = req.body.password2;


//Check for image Field
  if(req.file){
      console.log('Uploading File...');

  //file info
      var profileImageOriginalName  = req.files.profileimage.originalname;
      var profileImageName          = req.files.profileimage.name;
      var profileImageMime          = req.files.profileimage.mimetype;
      var profileImagePath          = req.files.profileimage.path;
      var profileImageExt           = req.files.profileimage.extension;
      var profileImageSize          = req.files.profileimage.size;
  } else {
    //Set a Default image
      var profileImageName = 'noimage.png';
  }

//Form Validation
  req.checkBody('name','Name field is required').notEmpty();
  req.checkBody('email','Email field is required').notEmpty();
  req.checkBody('email','Email not valid').isEmail();
  req.checkBody('username','Username field is required').notEmpty();
  req.checkBody('password','Password field is required').notEmpty();
  req.checkBody('password2','Password do not match').equals(req.body.password);

  // CHeck for errors
  var errors = req.validationErrors();

  if(errors){
    res.render('register',{
        errors: errors,
        name: name,
        email: email,
        username: username,
        password: password,
        password2: password2
    });
  } else {
      var newUser = new User({
        name: name,
        email: email,
        username: username,
        password: password,
        profileimage: profileImageName
    });
    // Create User
    User.createUser(newUser, function(err, user){
      if(err) throw err;
      console.log(user);
    });

    // Success Message
    req.flash('success','You are now registered and may login');

    res.location('/');
    res.redirect('/');

  }
});

module.exports = router;


//users/register go here

in user js in models

var mongoose = require('mongoose');
var db = mongoose.connection;

// User schema
// User Schema
var UserSchema = mongoose.Schema({
    username: {
        type: String,
        index: true
    },
    password: {
        type: String
    },
    email: {
        type: String
    },
    name: {
        type: String
    },
    profileimage: {
        type: String
    }

});


var User = module.exports = mongoose.model('User', UserSchema);

module.exports.createUser = function(newUser,callback){
  newUser.save(callback);
};

routes index.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Members' });
});

module.exports = router;
2
What is the problem? I don't get it.Gandalf the White
Sorry, Changed the question. First time mistake.Boogie
Man you not handling everything properly, where is the file uploading code .If you want to complete the whole process in one go then you'll have to upload the image first and then call for another function when upload is done to perform other function. Just tell me what you want straight away and I'll help.Gandalf the White

2 Answers

0
votes

Maybe you define your validator in wrong place. From docs https://github.com/ctavan/express-validator .

app.use(expressValidator([options])); // this line must be immediately after express.bodyParser()!

Also check your custom validation code and data that you receive in /register

Hope this helps.

0
votes

So I solved this after many tries and error. I thought multer was only needed in app.js but I added the following lines in users.js. I thought it was only needed in app.js.

Firstly I added

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

Then I changed (also in users.js

router.post('/users/register', function(req, res, next){
  
changed into -- (code below)


router.post('/register', uploads.single('profileimage'), function(req, res, next) {

And it all worked. But I wonder if someone could explain why this was needed in users.js and not only in app.js. Think of explaining it for a beginner.