const bodyParser = require('body-parser')
application/x-www-form-urlencoded
타입과 application/json
타입을 분석해서 가져올 수 있도록 해주는 코드이다.app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
User
에 정의를 해두었고 이것또한 import해야한다.const {User} = require("./models/User");
app.post('/register', (req, res) => {
const user = new User(req.body)
user.save((err, userInfo)=>{
if(err)return res.json({ success: false, err})
return res.status(200).json({
success:true
})
})
})
body-parser
가 해준다.save()
는 몽고 DB 함수이다.config 폴더를 만들어 민감정보를 따로 관리해주고 gitignore에 등록하여 옆에 초록 점을 없앤 상태이다.
if(process.env.NODE_ENV === 'production'){
module.exports = require('./prod');
} else {
module.exports = require('./dev');
}
process.env.NODE_ENV
가 환경변수라서 우리가 어디서 접속했는가를 문자열로 반환해준다. 그래서 Local 환경이라면 development
라고 반환된고 Deploy 후 라면 production
으로 반환한다.const config = require('./config/key')
mongoose.connect(config.mongoURI,{
}).then(()=> console.log('mongoDB is connected...'))
.catch(err=>console.log(err))
save()
전에 실시를 해야한다.genSalt()
const bcrypt = require('bcrypt');
const saltRounds = 10;
// 몽구스 method pre => ~전에
userSchema.pre('save', function(next){
var user = this;
// 뭐 할때마다 pw를 암호화하는 것이 아닌 pw를 바꾼다고 할 때만 pw를 암호화해주어야한다.
if(user.isModified('password')){
// 비밀번호를 암호화 시킨다.
bcrypt.genSalt(saltRounds, function(err, salt) {
if(err) return next(err)
bcrypt.hash(user.password, salt, function(err, hash) {
// Store hash in your password DB.
if(err) return next(err)
user.password = hash
next()
});
});
} else {
// 이 else 구문이 있어야 if 문이 아닐때 이더라도 빠져나올 수 있다.
next()
}
})
app.post('/login', (req, res) => {
User.findOne({email : req.body.email}, (err, user) => {
if(!user){
return res.json({
loginSuccess : false,
message : "존재하지 않는 e-mail입니다."
})
}
}
})
app.post('/login', (req, res) => {
User.findOne({email : req.body.email}, (err, user) => {
if(!user){
return res.json({
loginSuccess : false,
message : "존재하지 않는 e-mail입니다."
})
}
// 새로 추가된 함수
user.comparePassword(req.body.password, (err, isMatch)=>{
if(!isMatch) return res.json({ loginSuccess : false, message : "비번이 틀렸음" })
})
}
})
userSchema.methods.comparePassword = function(plainPassword, cb){
bcrypt.compare(plainPassword, this.password, function(err, isMatch){
if(err) return cb(err)
cb(null, isMatch)
})
}
npm install jsonwebtoken --save
npm install cookie-parser --save
app.post('/login', (req, res) => {
User.findOne({email : req.body.email}, (err, user) => {
if(!user){
return res.json({
loginSuccess : false,
message : "존재하지 않는 e-mail입니다."
})
}
user.comparePassword(req.body.password, (err, isMatch)=>{
if(!isMatch) return res.json({ loginSuccess : false, message : "비번이 틀렸음" })
})
// 새로 추가된 함수
user.generateToken((err, user)=>{
if(err) return res.status(400).send(err)
res.cookie("cookie_name", user.token)
.status(200)
.json({loginSucess : true, userId : user.id})
})
}
})
userSchema.methods.generateToken = function(cb) {
var user = this;
var token = jwt.sign(user._id.toHexString(), 'secretToken');
user.token = token
user.save(function(err, user){
if(err) return cb(err)
cb(null, user)
})
// user.save 라는 method가 어디서 나온거임?
}
Header, payload, Signature 3개의 부분으로 구성되어있다.