2016-06-30 9 views
0

mongo dbコレクションに文字列の配列を挿入しようとしています。メテオコレクションの配列に文字列を挿入する

そのエラーinsert failed: Error: Address must be a string

EDIT

私はのCCや参加者のためのダイナミックなフォームフィールドを生成し、そして配列にこれらの値を保存する必要が午前を考え出します。ここ

jQueryのスニペット:

$(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

は、私はいくつかのソリューションを試みたが、それは働いて得ることができなかったと言い、任意の提案をいただければ幸いです。

答えて

0

The .serializeArray() method creates a JavaScript array of objects, ready to be encoded as a JSON string

ので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>

+0

データはまず、空の配列としての提案のための –

0

に取り組んでいます。問題は()オブジェクトへのあなたの文字列を変換する方法serializeArrayに起因して発生している、しかし、あなたはまだ、その後serializeArrayメソッドを使用したい場合は、この

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

おかげで保存され、これは、問題を解決しませんコードスニペットは私の問題に対処していませんが、私の場合はccと出席者のための動的フォームフィールドを作成しています。これらの値の配列を持つ必要があります。 2番目の解決方法は、データを空の配列 –

0

方法のように行うことができます

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

特に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); 

をあなたはこのスキーマ定義されていたら、あなたがガイドラインとして次の例を使用して、インサートを実装することができます:あなたはそれをオブジェクトの配列になろうとするなら、あなたは次のように明示的にオブジェクトのキーの配列を定義する必要があります。これは、ユーザがセミコロンで区切られたテキスト入力の電子メールアドレスのリストを入力することを前提としています。これは、イベントハンドラに用意されているテンプレートスコープを使用しています。これにより、テンプレートのスコープによってコードのエラーが発生しにくくなります。このアプローチは、すべてのグローバルjQueryリファレンスを使用せずにMeteorでフォームを実行する方法です。

テンプレートコード:

<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 */ }); 
    } 
}); 
+0

として保存します。私はちょうど質問を更新した、私はCCと出席者のための動的なフォームフィールドをgereratingし、それらを配列に保存する必要がある –

+0

私はオブジェクト[オブジェクト]として置くことを試みた、挿入エラーが発生しました:エラー:0は文字列でなければなりません。 –

+0

私は自分のスキーマを修正しましたが、実装がうまく動作しません。あなたは私に助言してくれますか?私の場合、ユーザーはテキスト入力にセミコロンで区切られた電子メールアドレスのリストを入力しません。代わりに、ユーザーは私の質問に示されているように、新しい動的生成フィールドに電子メールを入力します –

関連する問題