2011-02-17 32 views
19

Estoy tratando de actualizar un modelo instanciado ('Lugar' - Sé que funciona desde otras rutas) en un MongoDB y he pasado un rato tratando de hacerlo correctamente. También estoy tratando de redirigir a la página que ve el 'lugar' para ver las propiedades actualizadas.Actualizar el modelo con Mongoose, Express, NodeJS

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

esquema:

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

Controller/rutas:

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

});

He intentado de varias maneras pero parece que no puedo conseguirlo.
Además, ¿no es así como declaro las tres variables {nombre, capital y continente} que bloquean más operaciones? Gracias. También se agradece la ayuda general para la depuración. Console.log (nombre) (justo debajo de la declaración) no registra nada.

Jade formulario:

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") 

Respuesta

32

Tienes que encontrar el documento antes de actualizar cualquier cosa:

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

funciona para mí en el código de producción que utilizan la misma configuración que tiene. En lugar de findById puedes usar cualquier otro método de búsqueda proporcionado por mangosta. Solo asegúrate de buscar el documento antes de actualizarlo.

+0

Así es como lo hago. – Carlosedp

+0

¡Gracias! Pregunta rápida: ¿cómo sabe la función de devolución de llamada anónima después de db.query que 'p' en su ejemplo es/debería ser el (los) resultado (s) de la consulta? ¿Es solo un comportamiento incorporado? – JohnAllen

+0

No lo "sabe" por sí mismo. Es por eso que debe verificarlo como nulo (ya que el resultado siempre es nulo en caso de error). En mi ejemplo, no usé el objeto 'err', aquí es donde se incluiría el mensaje de error exacto. si consulta los miembros incorrectos (por ejemplo 'p.foo' mientras que p no tiene ningún miembro de foo), obtendrá' undefined'. – schaermu

0

Creo que su problema es que está utilizando el nodo 0.4.0 - intente moverse a 0.2.6 con un debería funcionar. Se ha registrado un problema en github con el bodyDecoder no rellenando el campo req.body.variable en el nodo> = 0.3.0.

17

Ahora, creo que se puede hacer esto:

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

puede encontrar por id también:

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

Así que ahora puede encontrar directamente por id, esto es para v4 Mangosta

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

Solo para mencionar, si necesita un objeto actualizado, entonces necesita pasar {new: true} como

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