
어떤 부분이 어떤것을 책임지고 있는지
1. models 2.view 3. 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
const product= new Product({
userId:req.user._ id })
Product.findById(prodId).then(products=>{
//find는 수가 적을때 사용하는거 여서 cursor 로 뽑아내야됨
products.title= updateTitle;
products.price=updatePrice;
//여기서 바꾸고 이중 product 가능함
product.save()
}
https://www.zerocho.com/category/MongoDB/post/59a66f8372262500184b5363
아이디만 나오는게 아니라 전체 object 를 보여준다.. ( object 형식을 풀어준다)
아이디 금액 포함 아이디 뺌
Product.findByIdAndRemove(prodId).then(
()=>{
console.log('삭제 되었습니다');
}
const productsController= require(' ....컨트롤러 있는위치');
router.get('/add-product' ,productsController.getAddproduct):
경로가 맞으면 이것을 실행하는 것이다.
module.exports= router;
--> 결론적으로 admin/add-product
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()
}
app.use((req,res,next)=> {
User.findbyId(' 아이디 ').then(user=>{
req.user= user;
next();
}
moongeose 연결할때
mongoose.conncect(' ' )
.then(result=> {
USer. findone().then(user=>{
if(!user){
const user= new User({
name:'Max',
email: '~~' ,
cart:{
item:[]
}
}):
user.save();
>>>사용자가 없을꼉우에만.. 하나 추가 하겠따.
}
)
}
app.use( (req,res,next)=>{
uyserFindById(' ')
.then (user=>{
1. req.user= new User (user.name ,....);
2. req.user=user;
next();
}
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 /(새경로)
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')
https://devlog.jwgo.kr/2019/03/22/populate-vs-execpopulate-in-mongoose/
.populate(' ') . then() 안됨
그사이에 .execPopulate() 가 있어야됨
...i.productId._doc
-> productId가 가지고 잇는 그안의 내용물 볼떄

-> 너가 test@test.com 의 유저라는것을 알려주며 요청할때마다 같이 가는것이다.
[운전면허]의 기본 개념 같은것
mongodb 에 회원가입을 할시 _userid 가 자동으로 만들어지는데 그 아이디를
jwt 를 사용해서 새로운 json webtoken 으로 진행한다.
[malicious->악의적인][legitimate-정당한]
res.send({token: token});
-> 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);
req.user=user;
next();
const requireAuth= require('./middlewares/requrieAuth');
-->app.get('/', requireAuth,(req,res)=>
requireAuth가 맞으면 --> 새번째 변수인 (req,res)로 간다는 의미
error 가 생기면 자동으로 reject 된다는 의미
이제 req.user= 는올바른 db에 있는 정보를 받아온것이라고 할수 있다.?
내 비밀번호를 해쉬알고리즘을 통해 변경한다는 의미 .. ( 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;
스키마. 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)
}
}
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)
그 객체가 가지고 있는 함수를 실행해 달라는 의미입니다.
}