2016-03-29 6 views
0

Kann mir bitte jemand sagen, warum meine POST-Methode nicht über Mongoose in meine MongoDB speichern?Local Node API nicht zu Mongoose DB

Mein Angular Controller

$scope.saveUpdate = function(id){ 
    $http.post('/api/entry/' + id) 
     .success(function(data){ 
      $scope.entry = data; 
     }) 
     .error(function(data){ 
      console.log('There was a problem saving your entry: ' + data); 
     }); 
    // update page with remaining entries 
    $http.get('/api/entries').then(function(response){ 
     $scope.entries = response.data; 
    }); 
} 

Meine API

app.post('/api/entry/:entry_id', function(req, res){ 
    if (req.params) { 
     Entries.findByIdAndUpdate({ 
     _id : req.params, 
     // the properties we're updating and the new values 
     username: req.body.username, 
     date: req.body.date, 
     income: req.body.income 
     }, function(err, entry){ 
     if (err) { 
      res.send(err) } 
      else { 
      res.send('Success!'); 
      } 
     }) 
    } 
}); 

Die Schaltfläche in der

<button type="submit" class="btn" ng-click="saveUpdate(entry._id)">Update</button> 

Der aktualisierte Eintrag der DOM Ansicht einreichen trifft, wenn die Schaltfläche geklickt wird, aber wenn es trifft den Angular-Core-Code, der in den ursprünglichen Zustand zurückkehrt, ohne die DB zu aktualisieren. Es werden auch keine Fehler ausgelöst.

Antwort

1

Es gibt ein paar Dinge falsch im Code oben:

  1. Das gesamte req.params Objekt an das _id Feld übergeben wird statt req.params.entry_id
  2. Die Art und Weise Parameter findByIdAndUpdate() weitergegeben werden, ist falsch
  3. Der Anfragetext wird nie in Ihrer $http.post() gesendet, aber Sie erwarten, dass die req.body Daten in Ihrer Route
012 enthält

req.params Punkte auf das ganze params Objekt auf Anfrage. Sie möchten nur die ID von den Parametern erhalten und diese dann in Ihr Mungo-Modell übertragen.

Angenommen, Sie passieren die entry_id dann werden Sie Ihre erste Bedingung if(req.params) übergeben, da Params tatsächlich existieren wird. Wenn Sie jedoch req.params an _id Feld Ihres Modells Entries übergeben, übergeben Sie tatsächlich das gesamte Objekt { entry_id: '123' } statt nur 123.

Darüber hinaus ist die Art, wie Sie Werte an die findByIdAndUpdate-Methode übergeben, falsch. Es gibt 4 Parameter, die es dauert findByIdAndUpdate(id, [update], [options], [callback]), id ist das einzige erforderliche Feld. Sie übergeben das gesamte Objekt basierend auf der ID und aktualisieren die Werte in einem einzelnen Argument. Sie müssen entry_id aus den Feldern ausbrechen, die Sie aktualisieren möchten.

app.post('/api/entry/:entry_id', function(req, res) { 

    // Param Existence Checking 
    if (!req.params.entry_id) 
    return res.status(400).send('an entry_id must be provided'); 
    if (!req.body.username) 
    return res.status(400).send('a username must be provided'); 
    if (!req.body.date) 
    return res.status(400).send('a date must be provided'); 
    if (!req.body.income) 
    return res.status(400).send('an income must be provided'); 

    var updateData = { 
    username: req.body.username, 
    date: req.body.date, 
    income: req.body.income 
    }; 

    Entries.findByIdAndUpdate(req.params.entry_id, updateData, function(err, entry){ 
    if (err) 
     return res.status(500).send(err) 

    return res.status(200).send('Success!'); 
    }) 

}); 

auch basierend auf Beispielcode aus Ihrer Frage, ich sehe nicht, wo Sie in Werte zu req.body vorbei sind, wenn $http.put() tun. Eine Sache ist sicher, dass, wenn req.body nicht username, date und income enthält, Sie undefined diesen Feldern zugewiesen bekommen würden.

Um den Anfragetext über zu liefern, übergeben Sie ihn an den zweiten Parameter data.

$http.post('/api/entry/' + id, { 
    username: 'username', 
    date: new Date(), 
    income: 10000.00 
}) 
    .then(function(res, status){ 
    console.log(res.data); 
    }) 
    .catch(function(err) { 
    console.log(err); 
    }); 

Zusätzlich verwenden Sie nicht .success() in Ihrem Versprechen Kette, that approach is deprecated. Sie sollten den A + Standard und .catch() verwenden, wenn Sie Ihre Antwort bearbeiten.

+0

Ich sehe, was du sagst. Nach dem Ersetzen von 'entry_id' zu meiner Anfrage wird die Datenbank leider immer noch nicht aktualisiert. Es wird wieder auf den ursprünglichen Eintrag zurückgesetzt, wenn es einen 'completeRequest'-Callback in der angular.js-Core-Datei findet. Keine Ahnung, warum das so ist. – PanicBus

+0

@PanicBus siehe meine Antwort, ich habe den Aufruf von 'Entries.findByIdAndUpdate()' in meiner Antwort aktualisiert. Der erste Parameter sollte der _id-Wert sein, der mit "req.params.entry_id" übereinstimmt. Der zweite Parameter ist ein Objekt der Felder und ihrer Werte zum Aktualisieren. Sie übergeben Ihre Felder an Update und Ihre ID in einem Objekt und einem Parameter, der falsch ist. [Model.findByIdAndUpdate Docs] (http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate) – peteb

+0

Ich sehe was passiert. Und du hattest recht, "Körper" kommt als leeres Objekt 'Körper: {}'. Würdest du sofort wissen, warum das so ist und wie man die Daten analysiert, die vom Requ kommen? Ich habe die Body-Parser-Middleware eingebaut und benutzt. – PanicBus

Verwandte Themen