2017-08-27 2 views
0

私は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

DBにリモート接続していますか?

この場合、クライアントの時計とサーバーの時計が少し異なる場合があります。コードからは、クライアント側にとedを挿入してmoment()とし、選択した行をDBサーバー時刻NOW()と比較していることがわかります。

これをデバッグするには、すべての行または最後に挿入された行を(日付を比較せずに)フェッチし、挿入された行が実際に挿入後にDBから実際に見つかったことを確認します。

+0

多くのケースをテストしましたが、この重要なケースを見逃しました。 > =と<=で日付を比較する必要があります。ありがとうございました –

関連する問題