Joh*_*len 21 mongoose mongodb node.js express
我正在尝试更新一个实例化的模型('Place' - 我知道它可以在其他路由中工作)在MongoDB中并且花了一些时间尝试正确地执行此操作.我还试图重定向回查看"地点"的页面以查看更新的属性.
节点v0.4.0,Express v1.0.7,Mongoose 1.10.0
架构:
var PlaceSchema = new Schema({
name :String
, capital: String
, continent: String
});
Run Code Online (Sandbox Code Playgroud)
控制器/路线:
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)
});
Run Code Online (Sandbox Code Playgroud)
});
我尝试了一些不同的方法,但似乎无法得到它.
另外,我不是如何声明阻止进一步操作的三个{name,capital和continent}变量?谢谢.一般调试帮助也很感激.Console.log(名称)(在声明下面)不记录任何内容.
玉形式:
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")
Run Code Online (Sandbox Code Playgroud)
sch*_*rmu 37
您必须在更新任何内容之前找到该文档:
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')
});
}
});
Run Code Online (Sandbox Code Playgroud)
使用您拥有的相同设置在生产代码中为我工作.您可以使用mongoose提供的任何其他find方法,而不是findById.只需确保在更新之前获取文档.
小智 22
现在,我认为你可以这样做:
Place.findOneAndUpdate({name:req.params.name}, req.body, function (err, place) {
res.send(place);
});
Run Code Online (Sandbox Code Playgroud)
你也可以通过id找到:
Place.findOneAndUpdate({_id:req.params.id}, req.body, function (err, place) {
res.send(place);
});
Run Code Online (Sandbox Code Playgroud)
所以现在你可以直接通过id查找和更新,这是针对Mongoose v4的
Place.findByIdAndUpdate(req.params.id, req.body, function (err, place) {
res.send(place);
});
Run Code Online (Sandbox Code Playgroud)
只是提一下,如果你需要更新的对象,那么你需要{new: true}像
Place.findByIdAndUpdate(req.params.id, req.body, {new: true}, function (err, place) {
res.send(place);
});
Run Code Online (Sandbox Code Playgroud)