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



嗨,伙计们,我正在跟随一个似乎过时的Multer中间件教程。

首先,我有一些问题,它在控制台崩溃了,但我通过将文件替换为var upload = multer({dest: '。/上传"});。

但现在我得到一个问题,当我试图注册一个用户时,提交字段问题图像。而我所遵循的教程只是一个注册用户的进度。



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;

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

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

也检查你的自定义验证码和数据,你收到/register

所以我在多次尝试和错误之后解决了这个问题。我认为multer只需要在app.js中,但我在users.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。

最新更新