【问题标题】:Update data in MongoDB using Mongoose and Node.js使用 Mongoose 和 Node.js 更新 MongoDB 中的数据
【发布时间】:2020-03-15 16:12:14
【问题描述】:

当用户访问页面时,我正在尝试更新用户集合中的某些信息。

但是我的方法不起作用。任何人都可以帮助修复它。

app.get('/add-your-accommodation/apartment-type', (req, res, next) => {

  if (req.isAuthenticated()) {
    res.render('apartment-type.ejs')
  } else {
    res.render('login.ejs')
  }

  var id = req.params.id

  if(mongoose.Types.ObjectId.isValid(id)) {
     User.findByIdAndUpdate(id, {$set: {accomtype: 'house'}},{new: true})   
  }
});

【问题讨论】:

  • 补丁方法是什么意思?
  • 你能给我一个如何开始的例子吗?
  • 不行!
  • @kedarsedai 不管你使用什么方法,更新都应该有效。无论如何,当用户gets 页面(作为渲染)时,Herpryth 正在尝试更新。这里的问题是req.params.id 无效。 (未定义)因为在url中没有:id的定义(app.get的第一个参数)。
  • @NileshSingh 如何正确定义?

标签: node.js mongodb express mongoose


【解决方案1】:

您的req.params.id 未定义,因为在路由路径中没有提及它。你可以这样做,

app.get('/add-your-accommodation/apartment-type', (req, res) => {

  if (!req.isAuthenticated()) {
    return res.render('login.ejs')
  }

  res.render('apartment-type.ejs')

  var id = req.user._id //since you're using passport (LocalStrategy)

  if(mongoose.Types.ObjectId.isValid(id)) {
     User.findByIdAndUpdate(id, {$set: {accomtype: 'house'}})
  }
})

现在当你调用你的 API 时,这样做,

GET /add-your-accommodation/apartment-type

【讨论】:

【解决方案2】:

我同意@kedar-sedai,当您更新/更改数据库中的某些内容时,您不应该使用GET 请求。一个好的做法是使用PUT 方法,即使你没有任何东西可以传递。它使您和其他开发人员更容易一目了然地了解您的代码的作用。

这里有 4 个 HTTP 请求,适用于大多数用例:

获取

您想从数据库中检索信息(例如:获取用户、获取所有公寓类型...)

发布

您想要添加信息(例如:注册用户、添加公寓等),或使用 POST 请求的正文发送信息(例如:登录、...)

您想要更新一个值(例如:更改用户名、更改公寓类型……)

删除

您只是想删除数据库中的某些内容(例如:删除用户...)

【讨论】:

    【解决方案3】:

    试试findOneAndUpdate。此外,在查询函数中使用回调来获取错误或结果。

    
    app.get('/add-your-accommodation/apartment-type/:id', (req, res, next) => {
        if (req.isAuthenticated()) {
            res.render('apartment-type.ejs')
        } else {
            res.render('login.ejs')
        }
        var id = req.params.id
    
        if(mongoose.Types.ObjectId.isValid(id)) {
            User.findOneAndUpdate({_id: mongoose.Types.ObjectId(id)}, { $set: { accomtype:'house' } },(err, result)=>{
                if (err) throw new Error(err);
                console.log(result)
                return
            })   
        }   
    });
    

    【讨论】:

    • 不,它什么也没做!要我发送完整代码吗?
    • 感谢您将代码发送给我。我已经检查并使用findOneAndUpdate 更新了您的查询功能,它运行良好。见pastebin.com/7eRBLq0z
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2018-01-21
    • 1970-01-01
    • 2017-06-06
    • 2011-12-04
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多