如何使用Meteor将N个元素插入Mongodb中的Document

时间:2015-04-12 15:03:36

标签: javascript node.js mongodb meteor

我正在尝试过去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
    }
}
})

2 个答案:

答案 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]
});

应该让它继续下去。然而,我注意到还有两件事:

  1. 为什么在通话中传递三个参数 Meteor.call('bookInsert', book, authors, areas, ...但你没有 使用它们。另外,作者数组包含在本书中 对象,为什么要再单独传递它?

  2. 我假设您要确认用户是否已在此处登录:check(Meteor.userId(), String);。您应该在方法调用中使用this.userId对象(请参阅here)并检查它是否为null,即用户已登录

  3. 像这样:

    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]的对象数组。