[node.js] 서버공부

김린네·2022년 12월 13일

MVC

어떤 부분이 어떤것을 책임지고 있는지
1. models 2.view 3. controllers

Controllers

|-- products.js

const product= require(' ../models/prodcut');

exports. getAddproduct=(req,res,next)=> {
Product.find().then(products=>{
//find는 수가 적을때 사용하는거 여서 cursor 로 뽑아내야됨

res.render('add=product',{
pageTitle:'Add product'

})

}
|--shop.js

제품 가져오기

exports. getProduct=(req,res,next)=> {
const prodId= req.params.productId
Product.findById(prodId).then(products=>{
//find는 수가 적을때 사용하는거 여서 cursor 로 뽑아내야됨
res.render('add=product',{
pageTitle:'Add product'
})
}

제품 업데이트 하기

|--admin.js

제품 아이디 붙이기 < app.js 에서 설정했다.

const product= new Product({
userId:req.user._ id })

Product.findById(prodId).then(products=>{
//find는 수가 적을때 사용하는거 여서 cursor 로 뽑아내야됨
products.title= updateTitle;
products.price=updatePrice;
//여기서 바꾸고 이중 product 가능함

 product.save()
}

find () 는 전체 데이터 셋찾을떄 . populate('userId')

https://www.zerocho.com/category/MongoDB/post/59a66f8372262500184b5363

아이디만 나오는게 아니라 전체 object 를 보여준다.. ( object 형식을 풀어준다)

select( 'title price -_id')

아이디 금액 포함 아이디 뺌

제품 삭제하기

Product.findByIdAndRemove(prodId).then(
()=>{
console.log('삭제 되었습니다');

}

routes

1

const productsController= require(' ....컨트롤러 있는위치');

router.get('/add-product' ,productsController.getAddproduct):
경로가 맞으면 이것을 실행하는 것이다.

module.exports= router;

--> 결론적으로 admin/add-product

app.js 에서

const adminRouter=require('...경로'):
app.use('/adim' ,adminRouter);

접근할때마다 새로운 사용자 모델 추가 하기

mongoose.connect().then(result=> {
User.findOne().then(user=>{
if(!user){
const user= new User({
name:'MAX".....})
user.save()
}

유저 setting 하기

app.use((req,res,next)=> {
User.findbyId(' 아이디 ').then(user=>{
req.user= user;
next();
}

사용자 모델 사용하기 1

 moongeose 연결할때 
mongoose.conncect('  ' )
.then(result=> {


USer. findone().then(user=>{
if(!user){
const user= new User({
name:'Max',
email: '~~' ,
cart:{
item:[]
}
}):
user.save();
>>>사용자가 없을꼉우에만.. 하나 추가 하겠따.
}

)


}

사용자 모델 사용하기 2


app.use( (req,res,next)=>{

uyserFindById(' ')
.then (user=>{
1. req.user= new User (user.name ,....);
2. req.user=user;

next();
}

Models

1 |-product.js

스키마 생성하기

const moongoose= require('mongoose');
const Schema= moongoose.schema;
const productschema= new Schema({
title: {
type:String,
required:true
},
price:{
type:String,
required:true
}
});
->Schema 를 만들어서 어떤 형태인지 확인한다. -> 이용해서 만들기
module.exports=mongoose.model('Product', productschema);

---> controller 에서
const product= new Product({title:title , ... 등})
product.save().then().catch():

-> mongoUri 에서 (index.js ) 에서 .net /(새경로)

2 |--user.js

관계는 ref을 이용해서 연결

const productschema= new Schema({
cart: {
items:[{productId:{ type: Schema.types.ObjectId }, required: true},
quantity:{type:Number , required :true]
},
userId:{
type:Schema.Types.ObjectId,
ref:'User' //
}
});

장바구니 작업하기

userSchema~~.methods~~.addtoCart= function(product) 
독자적인 메소드를 가지고 있다.
{
const cartProducctIndex= this.cart.items.findIndex(cp=>{
return cp.productId.toString() ===

}
스키마를 기반으로 한 실제 인스턴스에 호출됨
1. 인덱스를 찾아서 [  ]  < [  productId:  ,qunatity: ]  
을 넣는다.  [] = updatedCartitems 
2. const updatedCart= {  items: updatedCartitems  }
3. this.cart= updatedCart


return this.save() < 알아서 저장하게 해놓음 


1. product 의 findbyid ( ) 를통해 object 얻어옴
2. return req.user.addToCart(product)
 -->req



cart.postOrder에서 
req.user.popluate('cart.items.productId')



execpopulate 와 populate 의 차이점

https://devlog.jwgo.kr/2019/03/22/populate-vs-execpopulate-in-mongoose/
.populate(' ') . then() 안됨
그사이에 .execPopulate() 가 있어야됨

...i.productId._doc
-> productId가 가지고 잇는 그안의 내용물 볼떄

1. jwt 란?

-> 너가 test@test.com 의 유저라는것을 알려주며 요청할때마다 같이 가는것이다.
[운전면허]의 기본 개념 같은것

mongodb 에 회원가입을 할시 _userid 가 자동으로 만들어지는데 그 아이디를
jwt 를 사용해서 새로운 json webtoken 으로 진행한다.

1-1. jwt 만들기

1. const token= jwt.sign({userId: user._id}, '스페셜 키로 공유하면 안되는 특별한 보안이다. ')

[malicious->악의적인][legitimate-정당한]
res.send({token: token});

2. 올바른 jwt 토큰을 가지고 있는가? -> middleware> requireAuth.js 파일만들기


-> const jwt= require('jsonwebtoken')
   const moongose = reuqire('moongoes')
   const user= moosege.model('user');
   
 
   module.exports=(res,res,next)=>{
   
   //ahtheciation 
    //header에 authorizaition : bearer (토큰 넣기 ) -postman 에서 확인
    -> const {authorization}= res.headers 에서 jwt 뜯어오기
    if(!authorization){
    return res.status(401).send({error:' you must logged in.})
   }
   
   //authorizaiton 'Bearer ....' 여서 
   const token = authorization.replace('Bearer ','');
   jwt.verify(token, 'My 시크릿 키', asny(err, payload)=>{
   
   if(err){
   reutrn res.status(401).send({error:'you must loggin'})
   };
   

--> 여기서 이제 jwt 당하기 이전의 상태 즉(_user:id) 상태로 변하게 됨
띠리서

const {userId}= payload;
const user= await.findById(userId);

--> user 가 이제 누구인지 알아냄 <접근할수 있다?

req.user=user;
next();

1-2 http 보낼때 두번째 변수에다가 선언

const requireAuth= require('./middlewares/requrieAuth');

-->app.get('/', requireAuth,(req,res)=>
requireAuth가 맞으면 --> 새번째 변수인 (req,res)로 간다는 의미
error 가 생기면 자동으로 reject 된다는 의미
이제 req.user= 는올바른 db에 있는 정보를 받아온것이라고 할수 있다.?

2. hash password

내 비밀번호를 해쉬알고리즘을 통해 변경한다는 의미 .. ( db 에 해쉬 알고리즘으로 변경된 것이 들어가 있따)

mypassword + ( 랜덤하게 작성된 (salt) 비밀번호 )
= > 해싱 알고리즘 -> db에 저장됨

const user= this << 여기서 db저장 전 (pre) 여서 . 이미 this = user 의 정보가 다 담겨져 있음...

bcrypt.genSalt(10,(err,salt)=> [
if(err)
return next(err)
{
bcrypt.hash(user.pasword, salt ,(err,hash)=>{
if(err){
return next(err)

}
user.password= hash;

2.1compare 하면서 맞춰보기

스키마. methods.comparePassword(함수이름이라고 생각)= function (password)
{

const user= this;

return new Promise((resolve,reject)=>{
bcypt.compare(password(함수 변수 ), user.password (db에 저장되어잇는거), (err, isMatch)=>{
if ( err){
reject(err)

}
if(!match)
{
return (false)
resolve(true)

}

}

login 할때

http 으로 보내는 password/ email 를뽑아내서
const{password,email}= req.body ;
User 디비안에 잇는 사용자 내역을 user 로 뽑아온다.

try{
await user.ComparePassword(password
( 함수 사용하는법 -> user(model) 안의 comparepassword 라는 함수가 있어요

const token= jwt.sign({userId: user._id}).

}
catch{

}

exports.Login = async (req, res, next) => {

 const login_email = req.body.email;
 const login_password = req.body.password;

 const user = User.findOne({ email: login_email });
 여기서 user 를 알아냈다. 그 user 의 객체를 알아냈다는것
 
 
 if (!user) {
  return res.status(422).send({ error: 'Invaild password or meail' })

 }
 try {
  await user.comparePassword(login_password)
   그 객체가 가지고 있는 함수를 실행해 달라는 의미입니다.
   
  
 }
profile
디자인 > https://dribbble.com/jongpil_77 코딩 > https://www.codewars.com/users/bikijjang

0개의 댓글