我是Mongoose的新手。 我正在开发一个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');
然后将其发送到我发送'标题的同一个对象中。属性。 我认为这个选项太不安全了,因为来自前端的任何人都可以发送任何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对象中?
我期待很快收到您的反馈意见。 谢谢。
答案 0 :(得分:0)
有点不同但是:
用户模型:
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
答案 1 :(得分:0)
我认为你应该在会话中存储用户的var express = require('express');
var router = express.Router(),
multer = require('multer');
var uploading = multer({
dest: __dirname + '../public/uploads/',
})
var type = uploading.single('file');
router.post('/upload', type, function(req, res) {
console.log('uploaded');
})
。要在会话中存储_id
,请使用_id
。它可以很好地处理身份验证,并且在成功身份验证后,它会将用户凭据存储在passport
中。所有请求中都存在此req.user
。因此,对于任何Route,您都可以从req.user
对象获取用户的_id
。你不需要从前端发送用户的_id。
保存req.user
时请使用此功能:
Task
阅读PassportJS docmentation以获取有关var task = new Task({
title: req.body.title,
owner : req.user._id
});
task.save(function(err){...});
和Session
的详细信息。