我正在尝试过去3天才能做到这一点并且还没有成功。我有以下代码,它添加了一个Book在MongoDB上进行Books
收集。该应用程序是使用meteor构建的:
//save authors book information
//as a book can have N authors, this loop get all input fields with authors
var authors = [];
$('.author-field').each(function(){
authors.push[{
'author': $(this).val()
}]
});
//save static book information
var book = {
title: $(e.target).find('[name=add-title]').val(),
(...)
language: $(e.target).find('[name=add-language]').val(),
authors: authors //add all authors here
}
Meteor.call('bookInsert', book, authors, areas, function(error, result) {
if(error)
return throwError(error.reason);
Router.go('/');
});
我总是收到错误。现在我明白了:
errorClass {message: "Match error: Unknown key in field authors", path: "authors", sanitizedError: errorClass, errorType: "Match.Error", stack: (...)…}
其他时候,几乎没有变化,我得到了:was expecting an object and got an array
或类似的东西。
我在这里做错了什么?
- 更新 -
实际添加到db的代码就是这个:
//meteor methods
Meteor.methods({
bookInsert: function(postAttributes, authors, areas) {
check(Meteor.userId(), String);
check(postAttributes, {
title: String,
(...)
language: String,
authors: Object
});
var user = Meteor.user();
//_.extend comes from Underscore library
var book = _.extend(postAttributes, {
userId: user._id,
author: user.username,
submitted: new Date()
});
var bookId = Books.insert(book);
return {
_id: bookId
}
}
})
答案 0 :(得分:2)
你可以做几件事。
首先,要将作者数据添加到您的数组中,您需要将push
函数的括号从[
更改为(
:
var authors = [];
$('.author-field').each(function(){
authors.push({
'author': $(this).val()
})
});
之后 console.log( authors )
确认它有效。
其次,您需要检查@ EduardoC.K.Ferreira建议的对象数组。所以你的检查功能应该是这样的
check(postAttributes, {
title: String,
(...)
language: String,
authors: [Object]
});
应该让它继续下去。然而,我注意到还有两件事:
为什么在通话中传递三个参数
Meteor.call('bookInsert', book, authors, areas, ...
但你没有
使用它们。另外,作者数组包含在本书中
对象,为什么要再单独传递它?
我假设您要确认用户是否已在此处登录:check(Meteor.userId(), String);
。您应该在方法调用中使用this.userId
对象(请参阅here)并检查它是否为null
,即用户已登录
if (! this.userId)
throw new Meteor.Error(401, "You must be logged in!");
最后,在使用之前,请确保user.username
存在。希望有所帮助。
答案 1 :(得分:0)
在我看来,您已经指定了作者字段检查错误,您将它与一个看起来应该是数组的对象匹配。
尝试更改方法中的以下内容,看看您是否能够保存:
check(postAttributes, {
title: String,
(...)
language: String,
authors: Any
});
如果我正确理解文档,您似乎需要检查类似[Object]
的对象数组。