将值保存到Express / Angular / Node中的对象数组中

时间:2013-10-24 12:51:44

标签: node.js mongodb angularjs express mongoose

我仍然掌握Express / Angular以及它们如何协同工作以发布到服务器。我在我的示例应用程序中使用MEAN堆栈。

我试图发布的对象的Schema在Express中看起来像这样。

首先定义'Version'架构:

var VersionSchema = new Schema({
title: {
    type: String,
    default: '',
    trim: true
},
content: {
    type: String,
    default: '',
    trim: true
},
submitted: {
    type: Date,
    default: Date.now
},
user: {
    type: Schema.ObjectId,
    ref: 'User'
}
});

版本架构用于草案架构。当用户创建草稿时,它将成为versions数组中的Version项。草稿更新后,它会创建一个新的数组项,以便保存草稿的所有版本。

var DraftSchema = new Schema({
    versions: [VersionSchema],
});

Draft Schema设置为Angular Service并注入我的控制器。该服务是用于创建$资源的样板代码,尽管不是必需的。

我有两个控制器来创建Draft对象并保存到Mongo:一个使用Angular,一个使用Express。

角度控制器:

$scope.create = function() {
    var version = {
        title: this.title,
        content: this.content
    };

    var draft = new Drafts({
        versions: [version]
    });

    draft.$save(function(response) {
        $location.path("drafts/" + response._id);
    });
};

在角度控制器中,我将要保存的标题和内容传递给草稿。据我了解,您不应使用Angular控制器将用户信息传递给服务器。所以这由Express在下面的控制器中处理。

Express控制器:

exports.create = function(req, res) {
var draft = new Draft(req.body);
draft.versions = [req.user]; // Here is where my problem is, trying to save user

draft.save(function(err) {
    if (err) {
        return res.send('users/signup', {
            errors: err.errors,
            draft: draft
        });
    } else {
        res.jsonp(draft);
    }
});
};

您可以在上面的评论中看到我的问题所在。我查看了docs,SO问题等,以便将User属性设置为此处创建的Versions数组项的正确方法。

请注意,如果我将用户从版本架构移动到草稿架构并使用:

draft.user = req.user;

要保存用户,它可以正常工作。但我希望将用户保存到VersionSchema中。

为了解决下面的Erick评论,这是我想要草稿模型的JSON表示。版本是一个数组,因为我希望每次更新草稿时都要创建一个新的数组项。

[{
    _id: 4h55542j232555000441,
    versions: [
        {
            title: “A really great title”, 
            body: “On that day the people….”, 
            user: 5234523452349589hh23523, 
            submitted: Date 
        }
    ]
}];

1 个答案:

答案 0 :(得分:0)

draft.versions = [req.user]

执行以下操作:将包含版本对象的versions数组替换为包含用户对象的新数组。这不是你想要的。

我认为,draft.versions有以下内容:

[
  {
    title: '...',
    content: '...'
  }
]

要添加用户ID,您需要执行以下步骤:

  1. 从版本数组中获取版本对象

  2. 为版本对象分配一个新属性,并为其赋值user._id

    var version = draft.versions [0]

    version ['user'] = req.user._id