2017-09-16 178 views
0

我正在尝试将一个字符串插入到数组中的数据库条目中。这是put方法本身:为什么我的Mongoose(findByIdAndUpdate)查询在数据库中更新?

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 

Theres no errors logging in console。我哪里错了?

E:

这里是我的架构,以及:

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

这里的URL编码分析器:

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

** ** findByIdAndUpdate预计只是** **的ID作为第一个参数。您可以使用** findOneAndUpdate **传递一个对象以通过_id进行匹配。 –

+0

@SteveHolgado嗯,即使传递只是req.params.id似乎没有帮助 – treo

+0

我明白你说的文本框清除,成功功能达成?如果是这样,我在处理程序中看不到任何回应。 'urlencodedParser'中间件是否可以响应请求并且处理程序的回调从来没有达到? –

回答

1

好了,在您需要添加的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() 
     } 
    ) 
    }) 
+0

I sincerely感谢帮助,这就像一个魅力! – treo

相关问题