2016-08-24 4 views
1

Привет, ребята, после учебника, который кажется устаревшим с промежуточным ПО Multer.Multer + Node js issue - Multer изменил API найти аналогичную, но не ту же проблему

Сначала у меня была проблема, с которой она сломалась в консоли, но я исправил это, заменив файл на var upload = multer ({dest: './uploads'}) ;.

Но теперь у меня возникает проблема, когда я пытаюсь зарегистрировать пользователя при заполнении полей Issue Image. В то время как учебное пособие я следую только прогрессу с зарегистрированным пользователем.



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;

+0

В чем проблема? Я не понимаю. –

+0

Извините, изменен. Ошибка первого раза. – Boogie

+0

Человек, который не обрабатывает все правильно, где находится файл, загружающий код. Если вы хотите завершить весь процесс за один раз, вам нужно сначала загрузить изображение, а затем вызвать другую функцию, когда загрузка выполняется для выполнения другой функции , Просто скажи мне, что ты хочешь, и я помогу. –

ответ

0

Может быть, вы определяете валидатор в неправильном месте. Из документов https://github.com/ctavan/express-validator.

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

Также проверьте свой собственный код проверки и данные, которые вы получите в/зарегистрировать

Надеются, что это помогает.

0

Так что я решил это после многих попыток и ошибок. Я думал, что multer нужен только в app.js, но я добавил следующие строки в users.js. Я думал, что это нужно только в app.js.

Во-первых, я добавил

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

Тогда я изменил (а также в users.js

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

 

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

И все это сработало. Но мне интересно, может ли кто-нибудь объяснить, почему это было необходимо в users.js и не только в app.js. Подумайте, объясните это для новичка.