2017-04-18 6 views
0

私はまだnodejsとJavascriptを使い慣れていませんが、私の質問が非常にシンプルなように見えても申し訳ありませんが、苦労してネット上で答えが見つからないようです。モジュールエクスポートでオブジェクトを渡す

基本的には、スクリプト(sqlRequest.js)を呼び出して呼び出しながら整数を送信します。このスクリプトは、データベースにSQLリクエストを送信し、結果(オブジェクト)を元のファイルに返します。 + essai:私はそれはconsole.log( "INDEX" を見ることができますコンソールで

exports.sendSQL = function(id) {  
var mysql= require('mysql'); 
    var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'bcombes', 
    password : 'bertrand1994', 
    database : 'totalkpi' 
    }); 
    connection.connect(); 
    var sql ="SELECT * FROM tra_ticket where id=?"; 
    var insert=[id]; 
    sql=mysql.format(sql, insert); 

    connection.query(sql, function(err, rows, fields) { 
     if (err) { 
      console.log('Error while performing Query.'); 
      connection.end(); 
     } 
     else { 
      connection.end(); 
      console.log(rows); 
      return rows; 
     } 
    });}; 

router.post('/request', function(req, res, next){ 
var id = req.body.id; 
var essai = require('./sqlRequest.js'); 

console.log("INDEX: "+essai.sendSQL(id)); }); 

そして今sqlRequest.jsコード:

はここのコードです。 sendSQL(id));定義されていないように見え、console.log(行)の前に表示されます。

サーバが関数が終了して変数を表示するのを待たずにいる可能性はありますか?

お寄せいただきありがとうございます。

+0

あなたがコールバックを必要とするので、あなたがDBのための非同期呼び出しをトリガーしています関数は、結果を待つために – siva

答えて

0

ファイル間で変数を渡すロジックは問題ありません。理由はessai.sendSQL(id)undefinedを返す理由は、connection.query(...)が非同期に呼び出され、質問で述べたように、console.logが起動してDBクエリが完了する前に発生します。その問題を解決するには

あなたは少しだけあなたのコードをリファクタリングする必要があります。sqlRequest.jsで

var essai = require('./sqlRequest.js'); 

router.post('/request', function(req, res, next){ 
    var id = req.body.id; 
    // send callback to sendSQL 
    essai.sendSQL(id, function(index) { 
     // this will only fire once the callback has been called 
     console.log("INDEX: " + index) 
    }) 
}); 

そして:

exports.sendSQL = function (id, cb) { 
    var mysql = require('mysql'); 
    var connection = mysql.createConnection({ 
     host: 'localhost', 
     user: 'bcombes', 
     password: 'bertrand1994', 
     database: 'totalkpi' 
    }); 
    connection.connect(); 
    var sql = "SELECT * FROM tra_ticket where id=?"; 
    var insert = [id]; 
    sql = mysql.format(sql, insert); 

    connection.query(sql, function (err, rows, fields) { 
     if (err) { 
      console.log('Error while performing Query.'); 
      connection.end(); 
     } 
     else { 
      connection.end(); 
      console.log(rows); 
      // call the callback 
      cb(rows); 
     } 
    }); 
}; 
+0

ありがとう、それは完全に動作しますが、それを同期的に呼び出す方法はありますか?なぜ非同期ですか?特別な理由はありますか?とにかくありがとう:) – Exo

+0

@Exo問題ありません! :) Node.jsはシングルスレッドなので非同期です.DBリクエストのようなアクションでは、DBレスポンスを待っている間に、アプリケーション全体が他のことをしないようにしたくないのです。つまり、同期DBリクエストを作成する方法があります。http://stackoverflow.com/q/32850045/4774345への回答を見てください。 – dan

関連する問題