【问题标题】:Meteor inserting array of strings into collection2流星将字符串数组插入collection2
【发布时间】:2016-06-30 07:36:46
【问题描述】:

我正在努力将字符串数组插入 mongo db 集合。

出现错误insert failed: Error: Address must be a string

编辑

我正在为 CC 和参加者生成动态表单字段,并且需要将这些值保存在一个数组中。

这里是 jQuery sn-p:

$(function(){
  $(document).on('focus', 'div.form-group-options div.input-group-option:last-child input', function(){
    var sInputGroupHtml = $(this).parent().html();
    var sInputGroupClasses = $(this).parent().attr('class');
    $(this).parent().parent().append('<div class="'+sInputGroupClasses+'">'+sInputGroupHtml+'</div>');
  });
  $(document).on('click', 'div.form-group-options .input-group-addon-remove', function(){
    $(this).parent().remove();
  });
});

html:

<form class="row form-horizontal newMeeting"> 
  <div class="form-group form-group-options col-xs-11 col-md-3" id="cc">
    <div class="input-group input-group-option col-xs-12">
      <input type="text" name="option[]" class="form-control" id="cc" placeholder="CCs">
      <span class="input-group-addon input-group-addon-remove">
        <span class="glyphicon glyphicon-remove"></span>
      </span>
    </div>
  </div>

  <div class="form-group form-group-options col-xs-11 col-md-3">
    <div class="input-group input-group-option col-xs-12">
      <input type="text" class="form-control" id="attendees" placeholder="Attendees">
      <span class="input-group-addon input-group-addon-remove">
        <span class="glyphicon glyphicon-remove"></span>
      </span>
    </div>
  </div>

  <div class="row no-print">
    <div class="col-xs-12">     
      <input type="submit" value="Save" class="btn btn-primary pull-right">
    </div>
  </div>
</form>

我的架构:

Emails = new Mongo.Collection('emails');


EmailSchema = new SimpleSchema({

 "attendeesEmail": {
  type: [Object],
  optional: true
},  
"attendeesEmail.$.address": {
  type: String,
  regEx: SimpleSchema.RegEx.Email
},
ccEmails: {
  type: [Object],
  optional: true
},
"ccEmails.$.address": {
  type: String,
  regEx: SimpleSchema.RegEx.Email
}
});

Emails.attachSchema(EmailSchema);

事件:

Template.form.events({
'submit .newMeeting': function(event) {
var cc = $('#cc').serializeArray();
var attendees = $('#attendees').serializeArray();
});

插入:

Emails.insert({
  attendeesEmail: [{address: attendees}],
  ccEmails: [{address: cc }]
});

console.log(attendees); 打印 [Object] 错误消息说insert failed: Error: 0 must be a string

我尝试了一些解决方案,但无法使其正常工作,任何建议都将不胜感激。

【问题讨论】:

    标签: mongodb meteor meteor-collection2 simple-schema


    【解决方案1】:

    .serializeArray() 方法创建一个 JavaScript 对象数组, 准备好被编码为 JSON 字符串

    所以cc参加者不是字符串

    你可以尝试使用 toSource() 方法:

    var cc = $('#cc').serializeArray().toSource();
    var attendees = $('#attendees').serializeArray().toSource();
    

    或者使用 JSON.stringify 方法

    var cc = JSON.stringify($('#cc').serializeArray());
    var attendees = JSON.stringify($('#attendees').serializeArray());
    

    但是 toSource 方法在 Chrome、IE 上不起作用。它适用于 Firefox
    API Here

       <!DOCTYPE html>
    <html>
    <head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
    <script>
    $(document).ready(function(){
    $("button").click(function(){
        var x = $("form").serializeArray();
        alert(JSON.stringify($("form").serializeArray()));
        $.each(x, function(i, field){
            $("#results").append(field.name + ":" + field.value + " ");
        });
    });
    });
    </script>
    </head>
    <body>
    
    <form action="">
      First name: <input type="text" name="FirstName" value="Mickey"><br>
      Last name: <input type="text" name="LastName" value="Mouse"><br>
    </form>
    
    <button>Serialize form values</button>
    
    <div id="results"></div>
    
    </body>
    </html>

    【讨论】:

    • 这并不能解决问题,因为数据存储为空数组
    【解决方案2】:

    您可以通过像这样更新事件来解决问题。

    Template.form.events({
      'submit .newMeeting': function(event) {
         var cc = $('#cc').val();
         var attendees = $('#attendees').val();
    });
    

    这个问题是由于 serializeArray() 方法将你的字符串转换为一个对象,但是如果你仍然想使用 serializeArray 方法,那么你可以这样做

    Template.form.events({
      'submit .newMeeting': function(event) {
         var cc = $('#cc').serializeArray().value;
         var attendees = $('#attendees').serializeArray().value;
    });
    

    【讨论】:

    • 感谢您的建议,第一个代码 sn-p 没有解决我的问题,因为它只存储单个值,在我的情况下,我正在为抄送和与会者创建动态表单字段。因此需要有一个这些值的数组。第二种方案将数据保存为空数组
    【解决方案3】:

    您明确定义架构的方式是错误的,尤其是 attendeesEmailccEmails 属性。如果您希望它是一个对象数组,那么您需要明确定义对象数组的键,如下所示:

    Emails = new Mongo.Collection('emails');
    
    EmailSchema = new SimpleSchema({
        "attendeesEmail": {
            type: [Object],
            optional: true
        },  
        "attendeesEmail.$.address": {
            type: String,
            regEx: SimpleSchema.RegEx.Email
        },
        ccEmails: {
            type: [Object],
            optional: true
        },
        "ccEmails.$.address": {
            type: String,
            regEx: SimpleSchema.RegEx.Email
        }
    });
    
    Emails.attachSchema(EmailSchema);
    

    一旦您定义了此架构,您就可以使用以下示例作为指导来实现插入。这假设用户在文本输入中输入以分号分隔的电子邮件地址列表。它使用事件处理程序中提供的模板范围,通过限定模板范围使代码更不容易出错,并且这种方法是在 Meteor 中执行表单的一种更简洁的方式,无需所有全局 jQuery 引用。

    模板代码:

    <template name="foo">
        <form id="myform" class="newMeeting">
            <input type="text" name="attendees" />
            <input type="text" name="cc" />
            <input type="submit" id="submit" />
        </form>
    </template>
    

    事件处理程序:

    Template.foo.events({   
        'submit form': function(event, template) {
            event.preventDefault();
    
            var attendees = template.find("input[name=attendees]"),
                cc = template.find("input[name=cc]"),
                attendeesList = attendees.split(';').map(function (email){ 
                    return { address: email } 
                }),
                ccList = cc.split(';').map(function (email){ 
                    return { address: email } 
                });
    
    
            // Do form validation
    
            var data = {
                attendeesEmail: attendeesList,
                ccEmails: ccList
            };
    
            // Clear form
            attendees.value = "";
            cc.value = "";
    
            Emails.insert(data, function(err) { /* handle error */ });
        }
    });
    

    【讨论】:

    • 谢谢。我刚刚更新了问题,正在为 CC 和参加者生成动态表单字段,需要将它们保存到数组中
    • 我尝试将其作为对象 [Object],这是我尝试的第一件事,但它一直抛出错误 insert failed: Error: 0 must be a string。跨度>
    • 我已经修改了我的架构,但我无法让实现工作。你能给我建议吗?在我的情况下,用户没有在文本输入中输入以分号分隔的电子邮件地址列表。相反,用户在我的问题中显示的全新动态生成字段中输入电子邮件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    相关资源
    最近更新 更多