2017-11-29 4 views
0

pug 대신 ejs 엔진을 사용하고 있습니다. 등록 단추를 클릭하면 등록보기에서 정의되지 않은 오류가 발생합니다. 유효성 검사 메시지를 얻을 수있는 기회는 거의 없었지만 다른 링크를 클릭 한 다음 등록 페이지로 돌아 가면 같은 오류가 다시 발생했습니다.nodejs : express-validator 오류가 ejs 템플릿에서 정의되지 않았습니다.

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)
가 아닌 기존 변수에 액세스하려고하기 때문이다

답변

1

, errors 변수는 생성되는 점에 유의하여보기로 반환하는 경우가 양식의 유효성 검사 오류가있는 경우 그렇지 않으면 정의되지 않은 것입니다. 따라서 귀하의 상태에서 errors 변수가 존재하는 경우,이 같이 확인 :

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

참고 : 변수가 선언되지 않은 경우 typeof 연산자는 문자열을 변수의 형식을 반환, 그것은 정의되지 않은 반환합니다

관련 문제