2016-10-20 4 views
1

Ich bin neu bei Nodejs, das mag ziemlich trivial erscheinen, aber ich habe Probleme beim Abrufen von Daten aus einer Funktion, die ein Versprechen zurückgibt. Die Antwort von der Middleware wird zurück an das Frontend gesendet. Hier ist mein CodeRückgabe von Daten an eine Middleware von einem Versprechen

// middleware 
app.get('/player', function(req, res) { 
      //data i want to return 
    res.send(getPlayerStats.getPlayerId(req.query.name))); 
}); 

//getPlayerStats.js 
var getPlayerId = function(name) { 
    return start(name) 
     .then(getPlayerInGame) 
     .then(getPlayerStats) 
     .then(getPlayers); 
    //.then(sendToSingular) 
} 

//getplayers function 
var getPlayers = function(data) { 
    return data; 
} 

Ich bin ich die Daten zurück in die falsche Richtung? Die Antwort, die ich am Frontend sehe, ist ein Objekt mit Prototyp als einziger Eigenschaft. Ich kann die Daten in getPlayers() ausdrucken und sehe, dass es gut funktioniert.

+0

Sie können nicht nennen 'res.send' auf asynchrone Methoden, die das Ergebnis zu einem späteren Zeitpunkt zurückkommen, werden Sie – adeneo

Antwort

3

Das liegt daran, dass Sie das Versprechen selbst in res.send übergeben.

res.send(/* You are passing a promise here */); 

Was Sie tun sollten, ist, warten, bis das Versprechen mit den Daten zu lösen und dann diese Daten senden:

getPlayerStats.getPlayerId(req.query.name).then(function(data) { 
    res.send(data); 
}); 
+0

Dank nem035 innerhalb der Callback für die Asynchron-Methode senden! Ich habe das getan und es funktioniert! – inhaler

+0

@inhaler kein problem amigo, froh zu helfen. Hier sind einige nützliche Ressourcen (http://stackoverflow.com/documentation/javascript/231/promises#t=201610202030578009337) und [diese eine] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referenz/Global_Objects/Promise)), um mehr über Versprechungen zu erfahren – nem035

0

Wenn Sie Middleware schreiben es klingt wie Sie die Spieler-ID zur Verfügung stehen wollen andere Maßnahmen so zusätzlich zu den anderen Kommentaren hier:

app.get('/player/*', function(req, res, next) { 
      //data i want to return 
    getPlayerStats.getPlayerId(req.query.name))).then(function(id){ 
     res.locals.playerId = id; 
     next(); 
    }); 
}); 


app.get('/player/action', function(req, res){ 
    res.send(res.locals.playerId); //or use it for further processing 
}); 
+0

Das wäre definitiv sehr nützlich, wenn ich anfange, an anderen Teilen dieses Projekts zu arbeiten. Danke vielmals!! – inhaler

1

Und ich empfehle immer Ihre Versprechen Kette mit einem catch() um sicherzustellen, dass Fehler zu beenden werden behandelt:

getPlayerStats.getPlayerId(req.query.name) 
    .then(function(data) { 
    res.send(data); 
    }) 
    .catch(function(error){ 
    res.status(500).send('Some error text'); 
    }); 
Verwandte Themen