2017-05-14 7 views
0

私はこのコードを使用して、データベース列から値を取得し、JSON配列で出力しました。私はブラウザコンソールでそれを取得することに成功したので、別の値で試してみました。コードに同じ形式を使用してクラスファイルから他のファイルのルータapp.postに渡しました。 console.logを使用するとターミナルで見ることができますが、ブラウザの応答で出力が見えないので何が問題なのですか?Node.js JSONエンコード - 配列出力が空です

成功した出力を出力コード:

auth.js、ルータの一部

app.post('/dispalymove', function (req, res, next) { 

var lMove=""; 


if(req.body.MoveString !== null){ 
    Move.setMoveUserId(req.user.id); 
    Move.setMoveString(req.body.MoveString); 
    lMove = a.getLastMove(req.user.GameId,function(move){ 
     console.log("Return from display move:",move); 

     }); 


    } 
    var output = {"msg":lMove, "loggedin":"true"}; 

    res.send(JSON.stringify(output)); 



}); 

私はmove.jsファイルを呼び出す機能:ブラウザのコンソールに応答

getLastMove(id,callback){ 


    var MoveRequest = "SELECT * FROM users ORDER BY id"; 

    var query = connection.query(MoveRequest, function(err,rows, result) { 

    if (rows.length == 0) { 
     return callback ("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"); 
    } 
    if (rows.length > 0) { 
     for (var i in rows) { 

     var move = rows[i].MoveString; 
      if (rows[i].GameId == id){ 

       callback(move); 
      } 

     } 
    } 


    }); 


     var move="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; 
     return move; 


} 

出力成功:

msg:"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" 
loggedin:"true" 

問題を抱えている出力コード

app.post('/getcolor', function (req, res, next) { 

var lCol=""; 

if(req.body.MoveString !== null){ 
    Move.setMoveUserId(req.user.id); 
    lCol = a.getColor(req.user.id,function(col){ 
    console.log("Return from getcolor:",col) 
      //the the value that i get on terminal "Return from getcolor:white" 

    }); 
    } 

    var output = {"msg":lCol, "loggedin":"true"}; 
    res.send(JSON.stringify(output)); 
}); 

私は他のファイルから呼び出す機能:私は私のブラウザのコンソール応答出力にちょうど

を取得した値

getColor(id,callback){ 

    var ColRequest = "SELECT * FROM users ORDER BY id"; 

    var query = connection.query(ColRequest, function(err,rows, result) { 

    if (rows.length == 0) { 
     return callback ("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"); 
    } 
    if (rows.length > 0) { 
     for (var i in rows) { 

      var col = rows[i].GameColor; 

      if (rows[i].id == id){ 

       callback(col); 
       } 

     } 
    } 
    }); 

     var col=""; 
     return callback(col); 
} 

loggedin:"true" 

このようにする必要があります

msg:"white" 
loggedin:"true" 

は、私はその

session_start(); 
include "../classes/move.php"; 
$lCol=""; 
if(isset($_POST['MoveString'])){ 
    $move = new move(); 
    $move->setMoveUserId($_SESSION['UserId']); 
    $lCol=$move->getColor($_SESSION['UserId']); 
} 
$output = array("msg"=>"$lCol", "loggedin"=>"true"); 
echo json_encode($output); 

と私は

public function getColor($id){ 
    include "../../connectToDB.php"; 

    $ColRequest=$_db->query("SELECT * FROM users ORDER BY UserId"); 
    $existCount = $ColRequest->rowCount(); 

    if ($existCount == 0) { // evaluate the count 
     return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; 
    } 
    if ($existCount > 0) { 
     while($row = $ColRequest->fetch(PDO::FETCH_ASSOC)){ 
      $userID = $row["UserId"];    
      $col = $row["GameColor"];     
      if($userID == $id) { 
       return $col; 

      } 
     } 
    } 
    $col=""; 
    return $col; 
} 

を呼び出す機能と出力のようにGETCOLOR投稿するPHP でこのコードを書くことを試みたそのブラウザのコンソール応答に関する

msg:"white" 
loggedin:"true" 
+1

非同期コールバックを介して返されるエラーを無視することは良い考えではありません。 –

+0

@partycoderありがとうございました –

答えて

0

lCol = a.getColor(req.user.id,function(col)
lColgetColorが何も返されないため、ここでは定義されていません。コールバックを期待し、このコールバックで値を返します(逆にgetLastMoveは何かを返します)。

app.post('/getcolor', function (req, res, next) { 

    var lCol = ""; 

    if (req.body.MoveString !== null) { 
     Move.setMoveUserId(req.user.id); 
     // lCol = <=== useless because a.getcolor returns nothing 
     a.getColor(req.user.id, function (col) { 
      console.log("Return from getcolor:", col) 
      //the the value that i get on terminal "Return from getcolor:white" 
      res.json({"msg": col, "loggedin": "true"}); // <=== here you have a defined lCol 
     }); 
    } else { 
     var output = {"msg": lCol, "loggedin": "true"}; // <=== here lCol always equals "" 
     res.json(output); 
    } 

    // var output = {"msg": lCol, "loggedin": "true"}; // <=== here lCol always equals undefined (when req.body.MoveString !== null) 
    // res.send(JSON.stringify(output)); 

}); 

編集:で試してみてくださいgetColorgetLastMove機能であなたがない戻りanthingをsould:ちょうど使用したコールバックを:connection.queryが非同期であるため、任意のリターンは無効になります。 getColorであなたは var col=""; return callback(col);をやっているので、あなたはいつもレスポンスを返すでしょう。
注意:サーバーの応答が終了するとき(複数の応答を1回のリクエストで送信することはできません)、コールバック関数を何度か呼び出さないでください。コールバック呼び出しがループにあります。を使用しないでください。

関連する問題