2016-08-08 14 views
2

Ich bin ein bisschen wie ein Noob arbeiten an meiner ersten CRUD-Anwendung (Traum Journal) mit Node, Express und MongoDB/Mongoose.Objekteigenschaft Schlüssel unterscheidet sich in req.body als Client-Seite (Express)

Ich erstelle ein einfaches Objekt basierend auf ein paar Benutzerformular Eingaben und dann eine Post-Anfrage an den Server, der wiederum Mongoose.save() aufruft.

Das Objekt, das ich auf der Clientseite erstelle, ist jedoch etwas anders als das, das vom Server empfangen wird, und ich bin völlig im Verlust, warum.

Zuerst ich einige Werte aus einer Form erhalten und sie in ein Objekt setzen:

// within button click event handler 

    var dreamText = $('#dream-text').val().trim(); 
    var dreamTags = ["tag 1", "tag 2", "tag 3"]; // for debugging 
    var dreamLucid = $('#dream-lucid').val() == 'Yes' ? true : false; 
    var dreamDate = $('#dream-date').val(); 

    var dream = { 
     userID: 'test', 
     text: dreamText, 
     tags: dreamTags, 
     isLucid: dreamLucid, 
     dateCreated: dreamDate 
    }; 

hier ein console.log Traum zeigt alles, wie es sein sollte:

Object {userID: "test", text: "sample text", tags: Array[3], isLucid: false, dateCreated: "2016-08-08"} 

Aus dort gebe ich eine POST-Anfrage mit dem Traumobjekt:

$.ajax({ 
     type: 'POST', 
     url: '/new', 
     data: dream, 
     success: function(data){ 
      console.log('dream saved'); 
     } 
    }); 

Jetzt auf der Serverseite, mit Express und Mongoose, ich bin versucht, das Objekt zu einem DB zu speichern:

router.post('/', urlencodedParser, function(req, res) { 
    console.log(req.body); 
    var newDream = Dream(req.body).save(function(err, data){ 
     if (err) { 
      throw error; 
     } 
    }); 
}); 

Alle Eigenschaften außer Tags speichern richtig, und ein console.log von req.body ergibt:

{ userID: 'test', 
    text: 'sample text', 
    'tags[]': [ 'tag 1', 'tag 2', 'tag 3' ], 
    isLucid: 'false', 
    dateCreated: '2016-08-08' } 

Beliebig Idee, warum die tags Eigenschaft auf der Clientseite 'tags[ ]' wird, wenn es durch die POST-Anfrage weitergegeben wird?

Ich habe versucht, sowohl tags: Array und tags: [String] in meinem Mongoose Modell, aber das Problem scheint auftreten zu werden, bevor ich jemals Mongoose.save.

Antwort

0

standardmäßig nennen, $.ajax() eine POST-Operation als application/x-www-form-urlencoded codiert, das verschiedene Dinge mit Arrays der Fall ist. Sie möchten wahrscheinlich nur JSON senden, damit Sie JSON auf dem Server empfangen können.

Sie können das verursachen durch manuelles Drehen Sie Ihre Daten in JSON passieren und die Einstellung der Art des Inhalts entsprechend:

$.ajax({ 
    type: 'POST', 
    url: '/new', 
    data: JSON.stringify(dream), 
    contentType: "application/json", 
    success: function(data){ 
     console.log('dream saved'); 
    } 
}); 

Dann können Sie auch die JSON auf der Server-Seite der Dinge analysieren müssen, entweder manuell für diese Anfrage oder mit einer Middleware wie .

+0

Es funktioniert jetzt, danke! Ich fand, dass ich auch 'bodyParser.json()' auf der Serverseite benutzen musste. –

+0

@ E.Walsh - Ja, das macht Sinn. Etwas auf der Serverseite muss den JSON parsen. Da es so aussieht, als ob Sie neu hier wären, wenn Sie Ihre Frage beantwortet haben, können Sie dies der Community anzeigen, indem Sie auf das grüne Häkchen links neben dieser Antwort klicken. Das bringt dir auch einige Reputationspunkte für das richtige Vorgehen. – jfriend00