我有一个文章架构和一个标签架构。我正在尝试将一个Tag对象引用数组保存到文章中。 这是我的文章架构:
var ArticleSchema = new Schema({
....
title: {
type: String,
.....
},
content: {
.....
},
.....
tags: [{
type: Schema.Types.ObjectId,
ref: 'Tag'
}]
});
标记架构:
var TagSchema = new Schema({
name: {
.....
},
user: {
......
},
count: {
.....
}
});
在前端,我有我的控制器。
'use strict';
// Articles controller
angular.module('articles').controller('ArticlesController', [
'$scope', '$stateParams', '$location', 'Authentication', 'Articles', 'Tags', '$filter',
function($scope, $stateParams, $location, Authentication, Articles, Tags, $filter) {
$scope.authentication = Authentication;
// Create new Article
$scope.create = function(isValid) {
$scope.error = null;
if (!isValid) {
$scope.$broadcast('show-errors-check-validity', 'articleForm');
return false;
}
var tagsArrays = this.tags.replace(/ /g, '').split(',');
var tagsObjectArray = [];
for (var i = 0; i < tagsArrays.length; i++) {
// Create tag object
var tag = new Tags({
name: tagsArrays[i]
});
tagsObjectArray.push(tag);
saveATag(tag);
//article.tags.push(tag);
}
function saveATag(tempTag) {
tempTag.$save(function(response) {
}, function(errorResponse) {
$scope.error = errorResponse.data.message;
});
}
// Create new Article object
var article = new Articles.articles({
title: this.title,
content: this.content,
tags: tagsObjectArray
});
// Redirect after save
article.$save(function(response) {
$location.path('articles/' + response._id);
}, function(errorResponse) {
$scope.error = errorResponse.data.message;
});
};
在后端,我有文章的控制器:
exports.create = function(req, res) {
var article = new Article(req.body);
article.user = req.user;
article.save(function(err) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(article);
}
});
};
当我尝试在文章中保存我的标签数组时,我得到错误: 投放到数组失败,因为路径“tags”的值“[object Object]” 我环顾四周并尝试了多种方法,但仍无法将其存储在数据库中。前端和后端的所有路线都设置正确。
答案 0 :(得分:1)
您的文章架构期待一组标记ObjectIds,而这些ID由Mongoose自动生成,但直到它们到达服务器。
从您的代码服务器控制器:
var errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')),
mongoose = require('mongoose'),
Tag = mongoose.model('Tag');
exports.createTag = function (req, res) {
var tag = new Tag(req.body); // tag._id now exists
tag.save(function (err) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
}
else {
res.json(tag);
}
});
};
因此,在前端控制器中,您需要保存所有标记,然后从保存响应中拉出_id字段,并将它们放入您使用文章保存的数组中。由于$ save函数是异步的,我建议使用Angular的$ q服务,尤其是$ q.all()函数,以确保在尝试保存文章之前保存所有标记。
var promises = [];
var tag;
var tagIds = [];
for (var i = 0; i < tagsArrays.length; i++) {
// Create tag object
tag = new Tags({
name: tagsArrays[i]
});
// $save() returns a promise, so you are creating an array of promises
promises.push(tag.$save());
}
$q.all(promises)
.then(function(tags) {
// When all the tag.$save() promises are resolved, this function will run
for(i = 0; i < tags.length; i++) {
// The response is an array of tag objects, extract the Ids from those objects
tagIds.push(tags[i]._id);
}
var article = new Articles({
title: this.title,
content: this.content,
tags: tagIds
});
// Save the article
return article.$save();
})
.then(function(article) {
// When the article save finishes, this function will run
$location.path('articles/' + article._id);
})
.catch(function(err) {
console.error(err);
});
答案 1 :(得分:0)
在前端控制器中,您将保存一个对象数组,其中唯一的字段是名称。同时你的mongoose模型需要一个objectIds数组,它们不是对象,而是你保存文档时得到的_id标签。因此,Mongoose尝试将您提供的标记从对象数组转换为基本字符串数组并引发错误。由于您自己并未保存标记,并且他们可能不会特定文章为其提供自己的Mongoose模型,因此只需在标记文章中标记一系列对象。