(猫鼬)如何从会话中获取user._id以便开机自检数据,包括此user._id



我是猫鼬的新人。 我正在开发一个带有用户身份验证的 MEAN 堆栈待办事项列表。

(换句话说,用户可以注册登录并创建、获取、更新和删除待办事项)。

这意味着 2 个架构:"用户"和"任务" 具有一对多的关系:一个用户可以有很多任务,许多任务属于一个用户。

这就是"任务"架构的外观:

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

为了构建 CRUD 方法,我需要将user._id作为"所有者"属性,否则任何用户都可以访问任务列表、创建更新或删除任务,

为了得到user._id,我想到了两个选择:

  1. 前端的 Angular2 将从之前存储的浏览器的 localStorage 获取user._id,以保持用户登录。

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

    然后在我发送"title"属性的同一对象中发送它。 我认为这个选项太不安全了,因为前端的任何人都可以发送任何 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 对象中?

我期待尽快收到您的反馈。 谢谢。

有点不同,但是:

用户型号:

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

任务模型:

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

使用邮政路由创建任务:

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
});

与编辑/更新类似,您可以使用放置路由(编辑)和删除路由(删除的方法覆盖)与"checkTaskOwnership"中间件,然后

Task.findByIdAndUpdate / Task.findByIdAndRemove

我认为您应该将用户的_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 文档以获取有关SessionAuthentication的更多详细信息。

最新更新