2016-04-01 31 views
0

学習ノードjs expressのユーザーログイン/登録を行っています。しかし、ファイルのアップロードに問題があります。なぜなら、私がフォームを送信するとき、コンソールは、未定義のプロパティ 'profileimage'を読み取ることができないと言うからです。未定義のmulterのプロパティを読み取ることができません

私は問題が私が適切にmulterモジュールを使用していないと思うが、私が言ったように私はちょうどノードを持つ初心者です。ここでは、コード

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 upload = multer({ dest: 'uploads/' }); 
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(upload.single('file')); 

// 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 epress session 
app.use(session({ 
    secret:'secret', 
    saveUninitialized: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; 

が、これはmulterを使用するコードである

私は本当にあなたの助けに感謝し、問題がif(req.file.profileimage)状態で

router.post('/register',function(req,res,next){ 
//recuperar datos del formulario 
    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; 

//revisar input de imagen 
if(req.file.profileimage){ 

     console.log('Uploading File..'); 
     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 defaut 
    var profileImageName='noimage.png'; 

    } 

    //validacion forma 
    req.checkBody('name','Name field is required').notEmpty(); 
    req.checkBody('email','Email field is required').notEmpty(); 
    req.checkBody('email','mail not valid').isEmail(); 
    req.checkBody('username','Userame field is required').notEmpty(); 
    req.checkBody('password','Password field is required').notEmpty(); 
    req.checkBody('password2','Passwords dont match').equals(req.body.passowrd); 
    //revisando errores 
    var errors= req.validationErrors(); 

    if(errors){ 
     res.render('register',{ 
      errors:errors, 
      name:name, 
      email:email, 
      username:username, 
      password:password, 
      password2:password2 
     }); 
    }else{//cuando los datos son válidos 
     var newUser= new User({ 
      errors:errors, 
      name:mame, 
      email:email, 
      username:username, 
      password:password, 
      profileimage:profileImageName 
     }); 
     User.createUser(newUser,function(err,user){ 

      if(err) throw err; 
      console.log(user); 
     }); 

     req.flash('success','your are redy'); 
     res.location('/'); 
     res.redirect('/'); 
    } 
}); 

ですこれは玉の形です

form(method='post',action='/users/register',enctype='multipart/form-data') 
    .form-group 
     label Name 
     input.form-control(name='name', type='text',placeholder='Enter Name') 
    .form-group 
     label Email 
     input.form-control(name='email', type='email',placeholder='Enter Email') 
    .form-group 
     label Username 
     input.form-control(name='username', type='text',placeholder='Username') 
    .form-group 
     label Password 
     input.form-control(name='password', type='password',placeholder='Enter Password') 
    .form-group 
     label Confirm Password 
     input.form-control(name='password2', type='password',placeholder='Confirm Password') 
    .form-group 
     label Profile Image 
     input.form-control(name='profileimage', type='file') 
    input.btn.btn-default(name='submit', type='submit',value='Register') 

私が言ったように、この問題はマルターですが、jadeファイルとusers.jsの名前属性が同じであるため、修正方法はわかりません。私もMulterのドキュメントをチェックしましたが、私はそれを自分で修正できませんでした。あなたの助けのための

Thxを:)

+0

問題は、ファイルがあなたの要求のOBJ(REQに定義されていないということですあなたのコードの.file)。それがなぜそうかもしれないのか? – user2263572

答えて

2

あなたがupload.single()を使用する場合は、入力フィールド名(profileimage)はすでに(それはupload.single()に渡された)が知られているので、あなただけのreq.fileの代わりreq.file.profileimageを使用しています。つまり、ファイルフィールドnameprofileimageからfileに変更するか、またはupload.single()に渡す名前を変更する必要があります。

また、通常、フィールド名が異なるため、ルートハンドラレベルでmulterミドルウェアが追加されることを追加する必要があります。このように、要求を解析するために、あなたはapp.use(upload.single('file'))を削除してから、あなたのルートハンドララインを変更したいので:に

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

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

ありがとうございました:D、私はそれを4回読む必要があったが、私はすべてを理解した。私はあなたの助けに本当に感謝しています:)私は私の頭で壁に当たっていました。 –

関連する問題