Multer + Node js问题--Multer改变API发现类似但不同的问题

时间:2016-08-24 09:16:30

标签: node.js multer

嗨,大家好我正在学习一个看起来过时的Multer Middleware教程。

首先我遇到了一些问题,它在consol中崩溃但是我通过将文件替换为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;

2 个答案:

答案 0 :(得分:0)

也许您在错误的地方定义验证器。 来自docs https://github.com/ctavan/express-validator

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

另请检查您在/ register

中收到的自定义验证代码和数据

希望这有帮助。

答案 1 :(得分:0)

所以我经过多次尝试和错误后解决了这个问题。我认为multer只在app.js中需要,但我在 users.js 中添加了以下几行。我认为只有在app.js中才需要它。

首先我添加了

A

然后我改变了(也在 users.js

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

这一切都奏效了。但我想知道是否有人可以解释为什么在users.js中需要这个,而不仅仅是app.js.考虑为初学者解释它。