2017-06-09 2 views
0

Also ich denke, ich habe das richtig, aber aus irgendeinem Grund ist es nicht ausgeführt, wie ich denken würde. Ich möchte nur den JWT Token dekodieren und die Daten zurückgeben. Hier ist der Code:Node.js Callback gibt keinen Wert an die aufrufende Funktion zurück. Just Timeout

var jwtToken = function(message, callback) { 
    var tokenArray = message.headers['authorization']; 
    var array = tokenArray.toString().split(' '); 

    if (array[0] == 'Bearer') { 
     var token = array[1]; 
    } else { 
     return callback.status(401).json({message: "bad json token"}); 
    } 

    var map = JSON.parse(process.env.AUTH0_SECRET); 

    var decoded = jwt2.decode(token, {complete: true}); 
    console.log('PAYLOAD:'); 
    console.log(decoded.payload); 
    var clientId = decoded.payload.aud; 
    var secret = map[clientId]; 

    //console.log('ENVIRONMENT SECRET: ' + map); 
    //console.log('CLIENT ID: ' + clientId); 
    //console.log('MAPPED SECRET: ' + secret); 

    jwt2.verify(token, secret, function(err, decode){ 
     if (err) { 
      callback.status(401).json({message: "JSON is incorrect or expired"}) 
     } else { 
      callback = decode; 
     } 
    }); 
}; 

//route to make sure that the API works 
app.get('/', function(req,res) { 
    jwtToken(req, function(data){ 
     console.log(data); 
     res.json({ message: 'You are connected to the API ' + data}) 
    }); 
}); 

Was würde ich erwarten, ist, dass ich in der Anforderung in die jwtToken Funktion übergeben und ich würde das dekodiert Token in dem Rückruf zurück. Ich würde dann die Antwort mit der Nachricht und dem entschlüsselten Token senden. Was ich bekomme, sind die Daten in den Protokollen des jwtToken-Aufrufs, aber dann läuft es weiter, bis es abläuft. Ich bin mir nur nicht sicher, was ich im Callback vermasselt habe, damit es das Ergebnis nicht zurücksendet. Danke für Ihre Hilfe.

+0

Also in der 'console.log (Daten)' können Sie das decodierte Token sehen? Meine Vermutung ist, dass es die 'res' im Callback nicht sehen kann. Ich denke, ein einfacher Weg, dies zu überprüfen, wäre, das 'res' Objekt in der Konsole innerhalb des Callbacks zu protokollieren und zu sehen, ob Sie undefiniert werden. Wenn dies der Fall ist, müssen Sie entweder in Erwägung ziehen, die "Res" zu übergeben oder Versprechungen hinzuzufügen. –

Antwort

2

Sie sind nicht Aufruf die callback überall. Nur Zuordnung es zu decode. Sie tun müssen:

callback(decode); 

decode Angenommen, der Wert ist, den Sie in Ihrem data im callback wollen.

+0

Ja, das hat funktioniert. Sobald ich den Rückruf (Dekodieren) gemacht hatte, funktionierte der Rückruf. Ich wusste, dass ich etwas falsch gemacht habe. Also eine andere Frage wäre die für den Fehler callback.status (401) .json ({Nachricht: 'blah'}) würde das auch in den Rückruf zurückgehen? –

+0

Nein. Sie erhalten tatsächlich eine Fehlermeldung, dass "status" keine Funktion ist. Eventuell möchten Sie 'callback ({status: 401, message: blah})' 'machen, dann checken Sie den Callback. –

+0

danke ich werde das tun –