2017-05-14 4 views
0

Ich habe diesen Code gescherzt, um einen Wert aus einer Datenbankspalte zur Ausgabe mit im JSON-Array zu erhalten. Ich schaffte es, es auf der Browser-Konsole zu bekommen, also versuchte ich es mit einem anderen Wert und benutzte das gleiche Format zum Code, um es von meiner Klassendatei an den Router app.post in der anderen Datei zu übergeben. Ich kann es auf dem Terminal sehen, wenn ich console.log benutze, aber ich kann die Ausgabe in der Browserantwort nicht sehen, also, was ist falsch?Node.js JSON-Encode - Array-Ausgabe ist leer

Der Code, der erfolgreich druckt Ausgabe:

auth.js, Router Teil

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)); 



}); 

Die Funktion, die ich auf move.js Datei aufrufen:

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; 


} 

Die Antwort auf die Browser-Konsole, wenn die Ausgabe ist erfolgreich:

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

der Ausgabe-Code, der das Problem

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)); 
}); 

Die Funktion, die ich von der anderen Datei anrufen:

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); 
} 

Der Wert, den ich in meiner Browser-Konsole Antwortausgabe erhalte

nur
loggedin:"true" 

das sollte so sein

msg:"white" 
loggedin:"true" 

Ich habe versucht, diesen Code mit PHP zu schreiben, wie die

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); 

und die Funktion zu schreiben getcolor, die ich

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; 
} 

und der Ausgang war rufen, dass auf Browser-Konsole Antworten

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

Ignorieren von Fehlern, die über asynchrone Rückrufe zurückgegeben werden, ist _never_ eine gute Idee. –

+0

@partycoder Danke, aber das hat nicht anders gemacht noch Ausgabe leer –

Antwort

0

Dies ist wegen lCol = a.getColor(req.user.id,function(col) :
lCol ist hier nicht definiert, weil getColor nichts zurückgibt, erwartet es einen Rückruf und gibt Ihnen einen Wert in diesem Rückruf (während getLastMove im Gegenteil etwas zurückgibt). Versuchen Sie, mit:

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)); 

}); 

bearbeiten: in der getColor und getLastMove Funktion Sould Sie nicht anthing Rückkehr: nur den Rückruf verwenden: weil connection.query asynchron ist eine Rückkehr wird ungültig; In getColor tun Sie var col=""; return callback(col); so haben Sie immer eine "" Antwort.
Achtung: Rufen Sie eine Callback-Funktion nicht mehrmals auf, wenn sie eine Serverantwort beendet (Sie können mehrere Antworten für eine Anfrage nicht senden): Ihre Callback-Anrufe sind in einer Schleife, sollten sie nicht, nur einmal aufrufen.