페이지에서 에러가 있는 경우 route간의 이동이 발생하는데, 이때 rotue 간의 정보 전달을 위해 flash라는 것을 사용한다.
flash는 문자열, 숫자, 배열, 객체 등의 어떠한 형태의 값이라도 사용가능하며 한번 생성 되면 사용될 때까지 서버 메모리상에 저장이 되어 있다가 한 번 사용되면 사라지는 형태의 data이다.
regex(reqular expression, 정규표현식)을 사용하여 user면 username, password면 암호만 들어가게 끔 특정한 형식의 값만 저장 할 수 있게 할 수도 있다.
// schema // 1
var userSchema = mongoose.Schema({
username:{
type:String,
required:[true,'Username is required!'],
match:[/^.$/,'Should be 4-12 characters!'], // 1-2
trim:true, // 1-1
unique:true
},
password:{
type:String,
required:[true,'Password is required!'],
select:false
},
name:{
type:String,
required:[true,'Name is required!'],
match:[/^.$/,'Should be 4-12 characters!'], // 1-2
trim:true // 1-1
},
email:{
type:String,
match:[/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]$/,'Should be a vaild email address!'], // 1-3
trim:true // 1-1
}
},{
toObject:{virtuals:true}
});
match를 통해 regex 부합하지 않으면 에러메세지를 내게 된다.
regex(/^.$/)
/
: regex는 / /
안에 작성합니다. 즉 / /
를 통해 이게 regex임을 알수 있습니다.
^
: 문자열의 시작 위치를 나타낸다.
.
: 어떠한 문자열이라도 상관 없음을 나타낸다.
: 숫자1 이상, 숫자 2 이하의 길이를 나타낸다.
$
: 문자열의 끝 위치를 나타낸다.
이메일의 regex
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]$/
// password validation // 2
var passwordRegex = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]$/; // 2-1
var passwordRegexErrorMessage = 'Should be minimum 8 characters of alphabet and number combination!'; // 2-2 에러메시지
userSchema.path('password').validate(function(v) {
var user = this;
// create user
if(user.isNew){
if(!user.passwordConfirmation){
user.invalidate('passwordConfirmation', 'Password Confirmation is required.');
}
if(!passwordRegex.test(user.password)){ // 2-3
user.invalidate('password', passwordRegexErrorMessage); // 2-4
}
else if(user.password !== user.passwordConfirmation) {
user.invalidate('passwordConfirmation', 'Password Confirmation does not matched!');
}
}
// update user
if(!user.isNew){
if(!user.currentPassword){
user.invalidate('currentPassword', 'Current Password is required!');
}
else if(!bcrypt.compareSync(user.currentPassword, user.originalPassword)){
user.invalidate('currentPassword', 'Current Password is invalid!');
}
if(user.newPassword && !passwordRegex.test(user.newPassword)){ // 2-3
user.invalidate("newPassword", passwordRegexErrorMessage); // 2-4
}
else if(user.newPassword !== user.passwordConfirmation) {
user.invalidate('passwordConfirmation', 'Password Confirmation does not matched!');
}
}
});
var passwordRegex = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]$/;
8-16자리 문자열 중에 숫자랑 영문자가 반드시 하나 이상 존재해야 한다는 뜻의 regex
정규표현식.test(문자열)
문자열에 정규표현식을 통과하는 부분이 있다면 true
를, 그렇지 않다면 false
를 반환
// index.js
...
var methodOverride = require('method-override');
var flash = require('connect-flash'); // 1
var session = require('express-session'); // 1
var app = express();
...
// Other settings
...
app.use(methodOverride('_method'));
app.use(flash()); // 2
app.use(session({secret:'MySecret', resave:true, saveUninitialized:true})); //3
...
flash
를 초기화하는 과정.
req.flash(문자열, 저장할 값)
의 형태로 저장할 값을 해당 문자열에 저장한다. 이때 flash는 배열로 저장된다.
req.flash(문자열)
인 경우 해당 문자열에 저장된 값들을 배열로 불러온다. 저장된 값들이 없다면 빈 배열([])을 리턴한다.
session(세션)
은 서버에서 접속자를 구분시키는 역할을 한다. 유저1, 유저2가 웹사이트를 보고 있는 경우 해당 유저들을 구분하여 서버에서 필요한 값 들(로그인 상태 정보 등)을 따로 관리하게 된다. flash에 저장되는 값 역시 유저1이 생성한 flash는 유저1에게, 유저2가 생성한 flash는 유저2에게 보여져야 하기 때문에 session이 필요하다.
은 옵션부분으로 secret은 session을 hash화하는데 사용되는 값이다. 아무 값이나 넣어주고 해커가 알 수 없게 하는 역할을 한다. 또한 환경변수에 저장하면 더욱 안전하다.
Uploaded by Notion2Tistory v1.1.0