it-swarm.com.de

Update-Modell mit Mongoose, Express, NodeJS

Ich versuche, ein instanziiertes Modell ('Place' - ich weiß, dass es von anderen Routen aus funktioniert) in einer MongoDB zu aktualisieren, und habe eine Weile damit verbracht, dies richtig zu tun. Ich versuche auch, zu der Seite zurückzukehren, auf der der Ort angezeigt wird, um die aktualisierten Eigenschaften anzuzeigen. 

Knoten v0.4.0, Express v1.0.7, Mongoose 1.10.0

Schema:

var PlaceSchema = new Schema({
name  :String
,  capital: String
,  continent: String
});

Controller/Route:

app.put('/places/:name', function(req, res) {
var name = req.body.name;
var capital = req.body.capital;
var continent = req.body.continent;
Place.update({ name: name, capital: capital, continent: continent}, function(name) {
    res.redirect('/places/'+name)
});

});

Ich habe verschiedene Wege ausprobiert, kann es aber nicht verstehen.
Erkläre ich auch nicht, wie ich die drei Variablen (Name, Hauptstadt und Kontinent) deklariere, die weitere Operationen blockieren? Vielen Dank. Allgemeine Hilfe zum Debuggen wird ebenfalls geschätzt. Console.log (Name) (direkt unter der Deklaration) protokolliert nichts.

Jade-Form:

h1 Editing #{place.name}
form(action='/places/'+place.name, method='POST')
  input(type='hidden', name='_method', value='PUT')
  p
    label(for='place_name') Name:
    p
    input(type='text', id='place_name', name='place[name]', value=place.name)
    p
    label(for='place_capital') Capital: 
    p
    input(type='text', id='place_capital', name='place[capital]', value=place.capital)
    p
    label(for='place_continent') Continent:
    p
    textarea(type='text', id='place_continent', name='place[continent]')=place.continent
    p
    input(type="submit")
21
JohnAllen

Sie müssen das Dokument finden, bevor Sie etwas aktualisieren:

Place.findById(req.params.id, function(err, p) {
  if (!p)
    return next(new Error('Could not load Document'));
  else {
    // do your updates here
    p.modified = new Date();

    p.save(function(err) {
      if (err)
        console.log('error')
      else
        console.log('success')
    });
  }
});

arbeitet für mich im Produktionscode mit dem gleichen Setup, das Sie haben. Anstelle von findById können Sie auch eine andere von mongoose bereitgestellte Suchmethode verwenden. Stellen Sie sicher, dass Sie das Dokument abrufen, bevor Sie es aktualisieren.

36
schaermu

Nun, ich denke du kannst das tun:

Place.findOneAndUpdate({name:req.params.name}, req.body, function (err, place) {
  res.send(place);
});

Sie können auch nach ID finden:

Place.findOneAndUpdate({_id:req.params.id}, req.body, function (err, place) {
  res.send(place);
});
20
k33g_org

So können Sie jetzt direkt nach ID suchen und aktualisieren, dies ist für Mongoose v4

Place.findByIdAndUpdate(req.params.id, req.body, function (err, place) {
  res.send(place);
});

Um nur zu erwähnen, wenn Sie ein aktualisiertes Objekt benötigen, müssen Sie {new: true} wie übergeben

Place.findByIdAndUpdate(req.params.id, req.body, {new: true}, function (err, place) {
  res.send(place);
});
4
Abhishek Gupta

Ich denke, Ihr Problem ist, dass Sie Knoten 0.4.0 verwenden. Versuchen Sie, auf 0.2.6 zu wechseln, und es sollte funktionieren. Auf github wurde ein Problem protokolliert, bei dem der bodyDecoder das Feld req.body.variable im Knoten> = 0.3.0 nicht auffüllt.

0
Chris