(Mongoose)如何从会话中获取user._id以便POST数据,包括此user._id

时间:2017-04-06 20:44:11

标签: node.js angular mongoose mean-stack mongoose-populate

我是Mongoose的新手。 我正在开发一个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');

    然后将其发送到我发送'标题的同一个对象中。属性。 我认为这个选项太不安全了,因为来自前端的任何人都可以发送任何ID。

  2. 从会话的后端获取当前的user._id。 (虽然我不知道怎么做)。并将其包含在POST方法的新任务对象中,如下所示:

  3. .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对象中?

    我期待很快收到您的反馈意见。 谢谢。

2 个答案:

答案 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的详细信息。