为什么我的Mongoose(findByIdAndUpdate)查询在数据库中没有更新?

时间:2017-09-16 16:12:19

标签: node.js mongodb mongoose

我正在尝试将字符串推入数组中,以查找由其ID找到的数据库条目。这是put方法本身:

app.put('/todo/:id', urlencodedParser, function(req, res) {
    Todo.findByIdAndUpdate({_id:ObjectId(req.params.id)},
        { "$push": { "item": req.body } },
        { "new": true, "upsert": true },
        function (err, data) {
            if (err) throw err;
            console.log("test");
        }
    ); });

问题是,日志永远不会打印到控制台,这让我觉得这个方法实际上并没有被调用。我假设它与前端部分有关,我在按钮提交时调用put方法,然后?:

  $('form').on('submit', function(){

      var item = $('form input');
      var todo = {item: item.val()};

      $.ajax({
        type: 'PUT',
        url: '/todo/' + id,
        data: todo,
        success: function(data){
          location.reload();
        }
      });

      return false;

  });

行为方面,当我点击提交按钮时,文本框会清除(应该如此),并将网址更改为:

/todo/59bd48905a2ed911e0d480f2?item=item+to+be+inserted

在控制台中登录没有错误。我哪里错了?

E:

这里也是我的架构:

var todoSchema = new mongoose.Schema({
  item: [String]
});

这里的Url编码解析器:

var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({extended: false});

1 个答案:

答案 0 :(得分:2)

好的,所以在前端代码中你需要添加preventDefault,而你还没有定义id变量。所以这应该有效:

$('form').on('submit', function (event) {
    event.preventDefault()
    var item = $('form input')
    var todo = {item: item.val()}
    var path = window.location.pathname.split('/')
    var id = path[2]
    console.log(id)
    $.ajax({
      type: 'PUT',
      url: '/todo/' + id,
      data: todo,
      success: function (data) {
        // do something with the data via front-end framework
        location.reload()
      }
    })

    return false
  })

在服务器中,无需字符串化req.body.item

app.put('/todo/:id', urlencodedParser, function (req, res) {
    console.log(req.body)
    Todo.findByIdAndUpdate(req.params.id,
      { '$push': { 'item': req.body.item } },
      { 'new': true, 'upsert': true },
      function (err, data) {
        if (err) throw err
        console.log('here')
        res.end()
      }
    )
  })