2017-08-27 29 views
0

我在MySQL中插入了記錄knexjs,但在立即返回舊記錄後進行選擇。爲什麼?當我設置timeout()來延遲插入和選擇函數之間時,返回正確的記錄!knexjs爲什麼mysql在插入後立即沒有返回正確的記錄選擇

function(cb) { //callUser plan 
    sd = moment(new Date()).format("YYYY-MM-DD HH:mm:ss"); 
    ed = moment(new Date()).add(31, 'days').format("YYYY-MM-DD HH:mm:ss"); 
    space = planDetail.space * 1024 * 1024 * 1024; 
    knex('user_plan') 
     .insert({ 
      'username': userDetail.username, 
      'plan_id': planDetail.id, 
      'created': knex.raw('NOW()'), 
      'start_date': sd, 
      'end_date': ed, 
      'transaction_id': tran.id, 
      'space': space, 
      'slot': planDetail.slot 
     }) 
     .asCallback(cb); 
}, 
function(res, cb) { 
    logger.log(res); 
    return cb(null); 
}, 
function(cb) { 
    knex.select('*').from('user_plan').where({ 
     username: self.username, 
    }) 
    .andWhere('start_date', '<', knex.raw('NOW()')) 
    .andWhere('end_date', '>', knex.raw('NOW()')) 
    .orderBy('id', 'desc') 
    .asCallback(function(err, rows) { 
     if(err) return cb(err); 

     logger.log(rows); 
    }); 
}, 
+0

你能指定一下你函數的執行順序嗎? – RaghavGarg

+0

你已經在標籤中指出你正在使用'async.js',但是你已經忽略了你正在使用的方法(平行,系列等),這可能是問題所在。請編輯您的問題以包含完整的代碼。 –

回答

0

你有遠程連接到你的數據庫嗎?

在這種情況下,您的客戶端時鐘和服務器時鐘可能有點不同。從代碼我可以看到,您正在創建插入sded在客戶端與moment(),然後您比較選定的行到您的數據庫服務器時間NOW()

您也可以通過獲取所有行或僅插入最後一行(沒有比較日期)來調試它,並看到剛插入的行實際上是在插入後直接從DB中找到的。

+0

我測試了很多案例,但錯過了這個重要的案例。我應該比較日期> =和<=。謝謝 –

相關問題