【问题标题】:Trying to update record in mongodb using mongoose. My application is using Node.js and Express 4尝试使用 mongoose 更新 mongodb 中的记录。我的应用程序正在使用 Node.js 和 Express 4
【发布时间】:2015-05-28 13:11:37
【问题描述】:

我正在构建 Web 应用程序来跟踪棒球运动员。目前与球员关联的唯一数据属性是 fName 和 lName。我正在使用 Node.js Express 4、mongoose 和 Jade。当您单击播放器时,我的 get 请求正常运行,它会将您带到 localhost:3000/player/:id 并将播放器信息正确加载到视图中。我的 post 方法存在问题并使其实际更新提交的玩家信息。我的 post 方法不是更新播放器,而是添加一个新播放器。

这是似乎正常运行的获取请求的代码:

    router.get('/:id', function(req,res){
       Player.find({_id: req.params.id}, function(err, player){
        if(err){
          res.redirect('/error');
        }else{
          res.render(
            'editPlayer',
            player[0]
          );
        }
      });
    });

这是创建新播放器而不更新当前播放器的帖子的代码:

    router.post('/:id', function(req,res){

       Player.where({ _id: req.params.id }).update({ fName: req.body.fName, lName: req.body.lName });

       res.redirect('player');
    });

这里是 editPlayer.jade,其中包含我用来更新播放器的表单:

    extends layout

    block content

      block content
        h1 #{fName} #{lName}
        form(method="post" action="/#{_id}")
          input(type="hidden" value=_id name="id")
          label(for="fName") First Name:
          input(type="text", name="fName", value=fName)
          label(for="lName") Last Name:
          input(type="text", name="lName", value=lName)
          input(type="submit", value="Save")

如果有更多有用的信息,请告诉我。提前感谢您的时间, -弗雷德·k

【问题讨论】:

    标签: node.js express mongoose pug


    【解决方案1】:

    让我们看看...你不想在路由器代码中调用 findOne() 而不是 find() 吗?

    可能只是您需要将 req.params.id 与 req.body.id 交换,顺便说一句。

    您可以在 POST 中尝试这种样式...(例如,注意这里使用 req.body.id 而不是 req.param.id)

    router.post('/:id', function(req,res) {
      Player.findOne({})
        .where('_id').equals(req.body.id)
        .exec(function(err, playerRecord) {
        if (playerRecord) {
          playerRecord.fName = req.body.fName;
          playerRecord.lName = req.body.lName;
          playerRecord.save();
          console.log('player/:id replace successful with Player record');
        } else {
          console.log('POST player/:id err');
        } // End of if (playerRecord)
        res.redirect('player');
      }); // End of Player.findOne
    }); // End of router.post
    

    【讨论】:

    • 嘿,非常感谢您的帮助。我不想说,但是您提供的代码运行时没有错误,但与我已有的代码类似,它只是添加一个新播放器,而不是实际编辑所选的播放器。
    • 此时我想我会在其中添加一个console.log(),它将记录传入的_id 是什么。它可能会让你大吃一惊。请注意,您有此代码 [input(type="hidden" value=_id name="id")] 我认为我没有完成。我通常会做一些事情,比如将变量传递给 Jade [res.render('player', { playerId: _id });] 然后 [input(type="hidden" value="#{playerId}" name="id" )]
    • 老兄,你真棒。我现在正在研究解决方案,但控制台日志显示该应用程序当前未使用正确的发布方法。而是点击了这篇文章,这是我用来创建新玩家的文章。 router.post('/', function(req, res) { console.log(req.body.id); new Player({fName : req.body.fName,lName : req.body.lName}) .save(function(err, player) { res.redirect('player'); }); });
    • 不错!所以这可以解释为什么它似乎无视你的尝试并做自己的事情。例如,控制台日志记录是解决诸如异步竞争条件等许多问题的唯一真正方法。 Node 对我来说也相对较新,它的底层平台与我更熟悉的其他平台之间的差异常常让我感到惊讶。
    • 嘿,所以在不断尝试失败并让我的路由正常运行之后,我最终只是从airpair.com/javascript/… 窃取了一些样板代码以供使用。谢谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2015-06-29
    • 2020-09-26
    • 2021-03-05
    相关资源
    最近更新 更多