2017-07-17 100 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); 
    }) 

}