2017-07-17 75 views
1
router.post('/orders/finish', function(req, res, next) { 
var order_id = req.body.order_id; 
var user_id = req.body.user_id; 
var table_id = ''; 

var result = []; 



mongo.connect(url, function(err, db) { 
    assert.equal(null, err); 

    db.collection('tables').update({id: table_id, status: true}, {$set: {status: false}}, function(err, result) { 
     assert.equal(null, err); 

    }); 
    var cursorTables = db.collection('tables').find({status: false}); 
    cursorTables.forEach(function(doc, err) { 
     assert.equal(null, err); 
     result.push(doc); 
    }, function() { 
     db.close(); 
     res.send(JSON.stringify(result)); 
    }); 

}); 

我正在更新表集合并尝试获取它们,但我得到的旧集合没有更新。然而在下一个请求中它发生了变化。Mongodb返回旧集合

+0

https://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-的可能的欺骗函数内异步 – JohnnyHK

+0

@JohnnyHK我已经使用setTimeout,但仍然无法正常工作 –

+0

'setTimeout'不是一个解决方案。关于'setTimeout'的链接问题是重复的,因为它正确处理异步函数的问题是相同的。 – JohnnyHK

回答

2

前完成,您的收集未完成更新呢。

您可以选择在.update()调用的回调函数中调用.find(),也可以根据您的版本使用promises或async/await。

另一种解决方案是使用findAndModify选项:

可选。如果为true,则返回修改后的文档而不是原始文档。 findAndModify()方法忽略删除操作的新选项。默认值是false。

0

你应该等待update当你让你的.find()调用调用find

db.collection('tables').update({id: table_id, status: true}, {$set: {status: false}}, function(err, result) { 
     assert.equal(null, err); 
     var cursorTables = db.collection('tables').find({status: false}); 
     cursorTables.forEach(function(doc, err) { 
      assert.equal(null, err); 
      resultTables.push(doc); 
     }, function() { 
      db.close(); 
     }); 
    }); 
+0

现在它没有任何返回 –

+0

您需要发布完整的代码,然后发生什么? –

+0

我更新了我的问题@ nick-shvelidze中的代码 –

0

我建议你使用Async

router.post('/', function(req, res) { 
    var order_id = req.body.order_id; 
    var user_id = req.body.user_id; 
    var table_id = ''; 

    mongo.connect(url, table_id, function(err, db) { 
     myFuntion(db, table_id, function(result) { 
      res.send(JSON.stringify(result)); // it should be what you need 
     }) 
    }) 

}); 

function myFuntion(db, table_id, callback) { 
    var result = []; 
    async.waterfall([ 
     function(callback) { 

      db.collection('tables').update({id: table_id, status: true}, {$set: {status: false}}, function(err, result) { 
       assert.equal(null, err); 
       callback(null); 
      }); 

     }, function(callback) { 
      db.collection('tables').find({status: false}, function(err, docs) { 
       docs.forEach(function(doc) { 
        result.push(doc); 
       }) 
       callback(null, result); 
      }); 
     } 
    ], function(err, result) { 
     callback(result); 
    }) 

}