2017-04-06 2 views
0

몽구스를 처음 사용했습니다. 사용자 인증으로 목록을 작성하려면 평균 스택을 개발 중입니다.(몽구스)이 user._id를 포함한 POST 데이터를 얻기 위해 세션에서 user._id를 가져 오는 방법

(즉, 사용자는 로그인을 등록하고 할 일을 작성, 가져 오기, 업데이트 및 삭제할 수 있습니다).

2 개의 스키마를 의미합니다. '사용자'와 '작업' 1 대 다수의 관계 : 사용자는 많은 작업을 수행 할 수 있으며 많은 작업이 사용자에게 속합니다.

이는 '작업'스키마 모습입니다 :

모든 사용자가 액세스 할 수 otherwhise 내가하는 '주인'속성으로 user._id 필요합니다 CRUD 방법을 구축하기 위해
const TaskSchema = new Schema({ 
     title:{ 
     type: String, 
     required: true 
     }, 
     owner:{ 
      type: Schema.Types.ObjectId, 
      ref:'User' 
     } 
    }); 

localSt에서 user._id를 얻을 것 프런트 엔드에

  1. Angular2 : 작업 목록, 그것이 내가 두 가지 옵션을 생각했다 user._id을 얻으려면,

    을 업데이 트를 만들거나 작업을 삭제 사용자를 로그인 상태로 유지하기 위해 이전에 저장된 브라우저의 orage.

    const user = localStorage.getItem ('user');

    그런 다음 '제목'속성을 보내는 것과 동일한 객체로 전송하십시오. 프론트 엔드의 모든 사용자가이 ID를 보낼 수 있기 때문에이 옵션이 너무 안전하지 않다고 생각합니다.

  2. 세션의 백엔드에서 현재 user._id를 가져옵니다. (나는 그것을하는 방법을 알고있다 would not).

.post('/task', function(req, res, next){ function(req, res, next){

var task = new Task({ 
    title: req.body.title, 
    owner : req.user._id  /// Does not do nothing 
}); 

if(!task.title){ 
    res.status(400); 
    res.json({ 
     "error":"Bad Data" 
    }); 
} else{ 
    task.save(task, function(err, task){ 
     if(err){ 
      res.send(err); 
     } 
     res.json(task); 
    }); 
} 

});

, 어떻게 (전자가 더 나은 경우를 제외하고) 두 번째 옵션을 촬영 : 그리고, POST 방법에서 새로운 작업 개체에서이 같은 그것을 포함 POST 메서드를 작성 하시겠습니까? 구체적으로 말하면 세션에서 현재 user._id를 가져 와서 새 Task 객체를 포함시킬 수 있습니까?

곧 귀하의 의견을 기다리겠습니다. 감사합니다.

답변

0

A는 다른 비트 만 :

사용자 모델 :

var UserSchema = new mongoose.Schema({ 
    username: String, 
    password: String 
}); 

작업 모델 : 편집과 마찬가지로

var text = req.body.text; 
var author = { 
    id: req.user._id, 
    username: req.user.username 
}; 

var newTask = {text: text, author: author}; 

Task.create(newTask, function(err, addedTask){ 
    // what you wanna do 
}); 

:

var taskSchema = mongoose.schema({ 
    text: String, 
    author: { 
     id: { 
      type: mongoose.Schema.Types.ObjectId, 
      ref: "User" 
     }, 
     username: String 
    } 
}); 

module.exports = mongoose.model("Task", taskSchema); 

포스트 경로와 작업을 만들기/풋을 사용할 수있는 업데이트 경로 (편집)과 'checkTaskOwnership'미들웨어 삭제 경로 (삭제를위한 방법 오버라이드) 다음

Task.findByIdAndUpdate/Task.findByIdAndRemove 
+0

방금 ​​제안을 따랐으며 광산과 동일한 오류가 표시됩니다. 정의되지 않은 '_id'속성을 읽을 수 없습니다. –

0

난 당신이 사용자의 _id 세션을 저장한다고 생각합니다. 세션에 _id을 저장하려면 passport을 사용하십시오. 인증을 실제로 처리하고 인증 성공시 사용자 자격 증명을 req.user에 저장합니다. 이 req.user은 모든 요청에 ​​있습니다. 따라서 어떤 경로에 대해서도 req.user 개체에서 사용자의 _id을 가져올 수 있습니다. 당신은 프론트 엔드에서 사용자의 _id를 보낼 필요가 없다.

Task 사용이 저장하는 동안 :

var task = new Task({ 
    title: req.body.title, 
    owner : req.user._id 
}); 

task.save(function(err){...}); 

읽기 PassportJS docmentation 더 자세한 정보에 대한 SessionAuthentication를 얻을 수 있습니다.

관련 문제