2017-11-29 13 views
0

Ich benutze ejs-Engine anstelle von Mops. Wenn ich Register-Knopf klicke, bekam ich Fehler undefined in meiner Registeransicht. Es gab nur eine geringe Chance, dass ich die Validierungsnachrichten erhalten konnte, aber wenn ich auf andere Links und dann zurück auf die Registrierungsseite klicke, trat derselbe Fehler erneut auf.nodejs: express-validator Fehler undefined in ejs Vorlage

Hier ist mein Code:

app.js

//app.js code 
 
var express = require('express'); 
 
var path = require('path'); 
 
var favicon = require('serve-favicon'); 
 
var logger = require('morgan'); 
 
var cookieParser = require('cookie-parser'); 
 
var bodyParser = require('body-parser'); 
 
var session = require('express-session'); 
 
var passport = require('passport'); 
 
var expressValidator = require('express-validator'); 
 
var LocalStrategy = require('passport-local').Strategy; 
 
var multer = require('multer'); 
 
var upload = multer({dest: './uploads'}); 
 
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', 'ejs'); 
 
    
 
// 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 Sessions 
 
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;

user.js

//user.js code 
 
var express = require('express'); 
 
var router = express.Router(); 
 
    
 
var multer = require('multer'); 
 
var upload = multer({dest: 'uploads/'}); 
 
/* GET users listing. */ 
 
router.get('/', function(req, res, next) { 
 
    res.render('members', {page_name : 'members'}); 
 
}); 
 
    
 
router.get('/register', function(req, res, next) { 
 
    res.render('register', { page_name: 'register' }); 
 
}); 
 
    
 
router.post('/register', upload.single('profileimage'), function(req, res) { 
 
    var name = req.body.name; 
 
    var username = req.body.username; 
 
    var email = req.body.email; 
 
    var password = req.body.password; 
 
    var password2 = req.body.password2; 
 
    
 
    
 
    if(req.file){ 
 
     console.log("uploading file"); 
 
     var profileimage = req.file.filename; 
 
    
 
    } else{ 
 
     var profileimage = "noimage.jpg"; 
 
    } 
 
    
 
    
 
    req.checkBody('name','Name field is required').notEmpty(); 
 
    req.checkBody('email','Email field is required').notEmpty(); 
 
    req.checkBody('email','Email is not valid').isEmail(); 
 
    req.checkBody('username','Username field is required').notEmpty(); 
 
    req.checkBody('password','Password field is required').notEmpty(); 
 
    req.checkBody('password2','Passwords do not match').equals(req.body.password); 
 
    
 
    // Check Errors 
 
    
 
    errors = req.validationErrors(); 
 
    //var errors = JSON.stringify(req.validationErrors()); 
 
    
 
    if(errors){ 
 
     console.log("errors: " + errors); 
 
    
 
     res.render('register', {errors: errors}); 
 
    } else{ 
 
     console.log('No Errors'); 
 
     res.render("/"); 
 
    } 
 
    
 
}); 
 
    
 
router.get('/login', function(req, res, next) { 
 
    res.render('login', { page_name: 'login' }); 
 
}); 
 
    
 
module.exports = router;

register.ejs

//register.ejs code 
 
    
 
<%include layout%> 
 
    
 
<div class="container"> 
 
    
 
<% if(errors){errors.forEach(function(error){%> 
 
    
 
    <div class="alert alert-danger"><%= error.msg %></div> 
 
    
 
    
 
    <% })} %> 
 
    
 
    <h4>register</h4> 
 
    
 
    <form action="https://stackoverflow.com/users/register" method="post" enctype="multipart/form-data"> 
 
     <div class="form-group"> 
 
      <label for="exampleFormControlInput1">Name</label> 
 
      <input type="text" class="form-control" name="name" placeholder="John"> 
 
     </div> 
 
    
 
     <div class="form-group"> 
 
      <label for="exampleFormControlInput1">Email address</label> 
 
      <input type="email" class="form-control" name="email" placeholder="[email protected]"> 
 
     </div> 
 
    
 
     <div class="form-group"> 
 
      <label for="exampleFormControlInput1">Username</label> 
 
      <input type="text" class="form-control" name="username" placeholder="username"> 
 
     </div> 
 
    
 
    
 
     <div class="form-group"> 
 
      <label for="exampleFormControlInput1">Password</label> 
 
      <input type="password" class="form-control" name="password" placeholder="password"> 
 
     </div> 
 
    
 
     <div class="form-group"> 
 
      <label for="exampleFormControlInput1">Confirm Password</label> 
 
      <input type="password" class="form-control" name="password2" placeholder="confirm password"> 
 
     </div> 
 
    
 
     <div class="form-group"> 
 
      <label for="exampleFormControlInput1">Profile Image</label> 
 
      <input type="file" class="form-control" name="profileimage" > 
 
     </div> 
 
    
 
    
 
     <button type="submit" class="btn btn-primary">Register</button> 
 
    </form> 
 
    
 
    
 
</div>

Error

ReferenceError: /Users/duanzhen/Documents/web_workspace/12_projects/node_auth/views/register.ejs:5 
 
    3| <div class="container"> 
 
    4| 
 
>> 5|  <% if(errors){errors.forEach(function(error){%> 
 
    6| 
 
    7|  <div class="alert alert-danger"><%= error.msg %></div> 
 
    8| 
 
    
 
errors is not defined 
 
    at eval (eval at compile (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/ejs/lib/ejs.js:549:12), <anonymous>:22:8) 
 
    at returnedFn (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/ejs/lib/ejs.js:580:17) 
 
    at tryHandleCache (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/ejs/lib/ejs.js:223:34) 
 
    at View.exports.renderFile [as engine] (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/ejs/lib/ejs.js:437:10) 
 
    at View.render (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/express/lib/view.js:127:8) 
 
    at tryRender (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/express/lib/application.js:640:10) 
 
    at Function.render (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/express/lib/application.js:592:3) 
 
    at ServerResponse.render (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/express/lib/response.js:971:7) 
 
    at /Users/duanzhen/Documents/web_workspace/12_projects/node_auth/routes/users.js:12:9 
 
    at Layer.handle [as handle_request] (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/express/lib/router/layer.js:95:5) 
 
    at next (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/express/lib/router/route.js:137:13) 
 
    at Route.dispatch (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/express/lib/router/route.js:112:3) 
 
    at Layer.handle [as handle_request] (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/express/lib/router/layer.js:95:5) 
 
    at /Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/express/lib/router/index.js:281:22 
 
    at Function.process_params (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/express/lib/router/index.js:335:12) 
 
    at next (/Users/duanzhen/Documents/web_workspace/12_projects/node_auth/node_modules/express/lib/router/index.js:275:10)

Antwort

1

Das ist, weil Sie eine nicht vorhandene Variable zuzugreifen versuchen, beachten Sie, dass errors Variable nur dann erzeugt wird und auf die Ansicht zurück, wenn es Wo Validierungsfehler in Ihrem Formular, sonst ist es nicht definiert, deshalb müssen Sie in Ihrem Zustand überprüfen, ob errors Variable existiert, So:

if (typeof errors !== 'undefined') { ... 

Hinweis: Der typeof-Operator eine Zeichenfolge, die den Typ der Variablen zurückgibt, wenn die Variable nicht deklariert ist, wird er zurückkehren undefined