2017-04-06 38 views
0

我在貓鼬是新的。 我正在開發一個MEAN堆棧要做與用戶認證的列表。(貓鼬)如何從會話獲得user._id爲了POST數據,包括該user._id

(換句話說,用戶可以註冊登錄和創建,獲取,更新和刪除做的)。

這意味着2個模式:'用戶'和'任務' 有一對多關係:用戶可以有很多任務,許多任務屬於一個用戶。

這是怎麼看的「任務」模式:

const TaskSchema = new Schema({ 
     title:{ 
     type: String, 
     required: true 
     }, 
     owner:{ 
      type: Schema.Types.ObjectId, 
      ref:'User' 
     } 
    }); 

爲了打造CRUD方法,我將需要user._id作爲「所有者」屬性,otherwhise的用戶都可以訪問任務列表,創建更新或刪除任務,

爲了得到user._id它,我就在想兩個選項:

  1. Angular2在前端將從localSt得到user._id 。ORAGE其中先前存儲保持記錄在用戶的瀏覽器

    const的用戶= localStorage.getItem(「用戶」);

    ,然後把它在同一個對象,我送「標題」屬性。 我覺得這個選項太不安全了,因爲任何來自前端的人都可以發送任何ID。

  2. 獲取從會議後端當前user._id。 (雖然我不知道該怎麼做)。並將其包括在POST方法的新任務對象,像這樣:

.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方法嗎? 具體而言,如何從會話中獲取當前的user._id並將其包含在新的Task對象中?

我期待儘快收到您的反饋。 謝謝。

回答

0

有點不同,但:

用戶模型:

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