使用Mongoose,Express,NodeJS更新模型

时间:2011-02-17 03:31:00

标签: mongodb node.js express mongoose

我正在尝试更新MongoDB中的实例化模型('Place' - 我知道它可以在其他路由中工作)并且花了一些时间尝试正确地执行此操作。我还试图重定向回查看“地点”的页面以查看更新的属性。

节点v0.4.0,Express v1.0.7,Mongoose 1.10.0

架构:

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

控制器/路线:

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

});

我尝试了很多不同的方法,但似乎无法得到它 另外,我不是如何声明阻止进一步操作的三个{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")

5 个答案:

答案 0 :(得分: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')
    });
  }
});

使用您拥有的相同设置在生产代码中为我工作。您可以使用mongoose提供的任何其他find方法,而不是findById。只需确保在更新之前获取文档。

答案 1 :(得分:21)

现在,我认为你可以这样做:

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

你也可以通过id找到:

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

答案 2 :(得分:4)

现在您可以通过id直接查找和更新,这是针对Mongoose v4

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

请注意,如果您需要更新对象,则需要传递{new: true}

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

答案 3 :(得分:0)

我认为你的问题是你正在使用节点0.4.0 - 尝试移动到0.2.6,它应该工作。在github上记录了一个问题,bodyDecoder没有填充节点> = 0.3.0中的req.body.variable字段。

答案 4 :(得分:0)

我的解决方案:model.js

  

const mongoose = require('mongoose')

     

constvalidator = require('validator')

     

const User = mongoose.model('User',{

     

名称:{

     

类型:字符串,

     

必填:是

     

修剪:是

     

},   电子邮件:{

     

类型:字符串,

     

必填:是

     

trim:是,

     

小写:true,

     

验证(值){

     

如果(!validator.isEmail(value)){

     

引发新错误(“电子邮件无效”)

     

}}},

     

密码:{

     

类型:字符串,

     

必填:是

     

最小长度:7

     

trim:是,

     

验证(值)   {   如果(value.toLowerCase()。includes('password')){

     

抛出新错误(“密码不能包含“密码””)   }   }   },   年龄:{   类型:数字,   默认值:0,   validate(value){

     

如果(值<0){

     

抛出新错误(“年龄必须为正数”)

     

}}}})

     

module.exports =用户

controller.js

exports.updateUser  =  async(req, res) => {



const  updates  =  Object.keys(req.body)

const  allowedUpdates  = ['name', 'email', 'password', 'age']

const  isValidOperation  =  updates.every((update) =>  allowedUpdates.includes(update))



if (!isValidOperation) {

return  res.status(400).send('Invalid updates!')

}



try {

const  user  =  await  UserModel.findByIdAndUpdate(req.params.id, req.body, { new:  true, runValidators:  true })



if (!user) {

return  res.status(404).send()

}



res.status(201).send(user)

} catch (error) {

res.status(400).send(error)

}

}
**router.js**
router.patch('/task/:id', taskController.updateTask)