2017-03-07 4 views
0

これはNodeJSの私の最初の課題です。私はすべてのコールバックと非同期のもので少し失われていると思います。MySQLとエクスプレスサーバを同期する

私はエクスプレスを使用してサーバーを持っており、要求の1つがDBに照会して結果を返すことを望んでいます。

他の言語であれば、そのようにして値を返す関数を書くとすべてが良好になります。

ため queryDB機能の
function queryDB(daysAgo){ 
    var connection = mysql.createConnection({ 
    host: "dbadress.com", 
    user: "dbuser", 
    password: "dbpassword", 
    database: "db" 
}); 
    var returnValue; 

    sqlQuery = "select * from db.database where time_created > now() - interval " + daysAgo + " day" 
    connection.query(sqlQuery, function(error, results, fields){ 
     if (error) throw error; 
     returnValue= results[0]; 
    }); 
    return returnValue; 

} 

app.get('/', function (req, res){ 
    var daysAgo = req.query.days_ago; 
    var returnValue = queryMICE(daysAgo); 
    res.send("Days Ago: '+ daysAgo + '\nTargeted URL: ' + returnValue); 
}); 

そしてもちろんリターンundefinedのものが同期していないです: 私のコードは、そのように見えます。

NodeJSのコールバックについての簡単な紹介と、クエリ値を返すためにこれをどのように書くべきでしょうか。

ありがとうございます!サイドノートとして

function queryDB(daysAgo, callback) { 
    var connection = mysql.createConnection({ 
     host: "dbadress.com", 
     user: "dbuser", 
     password: "dbpassword", 
     database: "db" 
    }); 

    sqlQuery = "select * from db.database where time_created > now() - interval " + daysAgo + " day"; 
    connection.query(sqlQuery, function (error, results, fields) { 
     if (error) { 
      throw error; 
     } 
     callback(results[0]); 
    }); 
} 

app.get('/', function (req, res) { 
    var daysAgo = req.query.days_ago; 
    queryDB(daysAgo, returnValue => res.send("Days Ago: " + daysAgo + '\nTargeted URL: ' + returnValue)); 
}); 

:代わりにあなたのqueryDBが値を返すたの

答えて

1

、このように、戻り値を受け取り、それにコールバック関数を渡すことがextremeley危険なを作成することです。要求パラメータを連結したSQLクエリ。 は、このようなコードを本番で使用する必要がありますが、これは別の話です。 Googleは "SQLインジェクション"の詳細については、

+0

この行の 'queryMICE(daysAgo、returnValue => res.send(" Days Ago: '+ daysAgo +' \ nターゲットURL: '+ returnValue)); '' => ' ? – Dan

+0

これは矢印の機能ですが、次のように書くこともできます: 'queryMICE(daysAgo、function(returnValue){res days(" DaysAgo: "+ daysAgo + '\ nTargeted URL:' + returnValue);}) ; ' –

+0

ありがとう!' daysAgo'はまだ関数のスコープ内にありますか? – Dan

関連する問題