2017-12-06 4 views
0

DBにクエリを実行してデータを挿入している間に、配列periodsをループするのに苦労しています。私が直面している問題は最後の行から5番目に見ることができます。最後のdb.queryPromiseは呼び出されません。ループ内でのコミットメント

問題がどこにあるかを下から5行コメントを参照してください。

// db.js 

const mysql = require('mysql'); 

const connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : ****, 
    password : ****, 
    database : ****, 
}); 

module.exports = connection; 

module.exports.queryPromise = function (args) { 
    return new Promise((resolve, reject) => { 
    connection.query(args, (err, rows, fields) => { 
     if (err) return reject(err); 
     resolve(rows); 
    }); 
    }); 
}; 

module.exports.connectPromise = new Promise((resolve, reject) => { 
    connection.connect(err => { 
    if (err) reject(err); 
    resolve(); 
    }); 
}); 

// app.js 
const db = require('../config/db'); 

const periods = ['1h','12h','24h','1w','1m','3m','1y','all']; 
const sqlCarIds = `SELECT id FROM car_models ORDER BY id DESC LIMIT 200;`; 

return db.queryPromise(sqlCarIds) 
.then((rows) => { 
    const car_ids = []; 
    for (let i = rows.length - 1; i >= 0; i--) { 
    car_ids.push(rows[i].car_id); 
    }; 

    for (let i = periods.length - 1; i >= 0; i--) { 

    const sqlSnapshot = `SELECT price FROM car_models;`; 

    db.queryPromise(sqlSnapshot) 
    .then(([row]) => { 
     if (!row) { 
     throw new Error('API call found nothin'); 
     } 

     const highPrice = row.high; 
     const sqlInsert = `INSERT into price_cache (high) VALUES (` + highPrice` +)`;` 

     console.log(sqlInsert); // logs correctly formed query 
     db.queryPromise(sqlInsert) 
     .then(() => { 
     console.log('this should fire'); // doesn't fire 
     }); 
    }); 
    } 
}); 
+0

達成したいことはありますか? *なぜ*あなたがこれをやっているのか、あなたの現在のコードに間違っているのかを説明してください。 –

+0

目的は、大規模なデータベースから価格データを上書きする小さなデータベースにデータを移動することです。これにより、サーバーがすべてのフィルタリングを実行している間に、ユーザーのクエリを高速化できます。私は発火しない行とコードが間違っている行をコメントしました。エラーはありませんが、sqlInsertクエリは単に呼び出されません。 – Nick

+0

@ニック 'db.queryPromise'関数の中で' console.log(err) 'を使って、クエリのためにエラーがないことを確認してください。 –

答えて

0

sqlInsertのSQL構文は無効です。次の例のように記述する必要があります。式の値を "Template String"に追加するには、${expression}リテラルを使用する必要があります。 promiseは、拒否するエラーがあるため解決されません。

const sqlInsert = `INSERT into price_cache (high) VALUES (${highPrice})`; 
+0

あなたが書いて申し訳ありません、それは質問のタイプミスでした。残念ながら、正しく提供された式でもエラーはなく、単に呼び出されません。構文はすべてOKで、 – Nick

+0

で動作します。あなたは 'db.queryPromise'メソッドのソースコードを追加できますか? – Siggy