web-dev-qa-db-fra.com

Mise à jour du modèle avec Mongoose, Express, NodeJS

J'essaie de mettre à jour un modèle instancié ('Place' - je sais que cela fonctionne à partir d'autres routes) dans une MongoDB et j'ai passé un moment à essayer de le faire correctement. J'essaie également de rediriger vers la page qui affiche l'emplacement pour afficher les propriétés mises à jour. 

Nœud v0.4.0, Express v1.0.7, Mongoose 1.10.0

Schéma:

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

Contrôleur/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)
});

});

J'ai essayé différentes méthodes mais je n'arrive pas à comprendre.
De plus, comment déclarer les trois variables {nom, capital et continent} bloquant des opérations ultérieures? Merci. L’aide générale au débogage est également appréciée. Console.log (nom) (juste en dessous de la déclaration) n'enregistre rien.

Forme de jade:

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

Vous devez trouver le document avant de mettre à jour quoi que ce soit:

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')
    });
  }
});

fonctionne pour moi dans le code de production en utilisant la même configuration que vous avez. Au lieu de findById, vous pouvez utiliser n’importe quelle autre méthode de recherche fournie par mangouste. Assurez-vous simplement de récupérer le document avant de le mettre à jour.

36
schaermu

Maintenant, je pense que vous pouvez faire ceci:

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

Vous pouvez trouver par identifiant aussi:

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

Alors maintenant, vous pouvez trouver et mettre à jour directement par identifiant, ceci est pour Mongoose v4

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

Mentionnons simplement que si vous avez besoin d’un objet mis à jour, vous devez alors passer {new: true} comme

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

Je pense que votre problème est que vous utilisez le noeud 0.4.0 - essayez de passer à la version 0.2.6 avec une méthode qui devrait fonctionner. Il y a un problème enregistré dans github avec bodyDecoder qui n'a pas renseigné le champ req.body.variable dans le noeud> = 0.3.0.

0
Chris