我是猫鼬的新人。 我正在开发一个带有用户身份验证的 MEAN 堆栈待办事项列表。
(换句话说,用户可以注册登录并创建、获取、更新和删除待办事项)。
这意味着 2 个架构:"用户"和"任务" 具有一对多的关系:一个用户可以有很多任务,许多任务属于一个用户。
这就是"任务"架构的外观:
const TaskSchema = new Schema({
title:{
type: String,
required: true
},
owner:{
type: Schema.Types.ObjectId,
ref:'User'
}
});
为了构建 CRUD 方法,我需要将user._id作为"所有者"属性,否则任何用户都可以访问任务列表、创建更新或删除任务,
为了得到user._id,我想到了两个选择:
前端的 Angular2 将从之前存储的浏览器的 localStorage 获取user._id,以保持用户登录。
const user = localStorage.getItem('user');
然后在我发送"title"属性的同一对象中发送它。 我认为这个选项太不安全了,因为前端的任何人都可以发送任何 ID。
从会话获取后端的当前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 文档以获取有关Session
和Authentication
的更多详细信息。