2017-02-23 5 views
2

NodeJS mit v. 7.5.0 Ich erhalte UnhandledPromiseRejectionWarning & & DeprecationWarning Ich weiß, seinen Teil der neuen Funktionen, da der Knoten 6.6, aber das, was ich nicht verstehe, ist dass ich diese Versprechungen direkt nach dem Zwischenspeichern in eine Variable erhalte. Wenn ich es nicht zwischenspeichere, wird keine Warnung ausgelöst. Dies ist der Code, der den Fehler wirft:Caching Versprechen führt zu Unbehandelte Versprechen Ablehnung in Node.js

let verifyPromise = verifyToken(id_token); 

    verifyPromise.catch((err) => { 
     log(err); 
    }); 

    let verifyOkPromise = verifyPromise.then((login) => { 

     return DB_API.getTokenById(id_token);; 
    }); 

    verifyOkPromise.catch((err) => { 
     log('error in finding token: ', err); 
    }); 


    verifyOkPromise.then((dbRes) => { 
     log('loggin res in finding token: ', dbRes); 
    }); 

wo verifyToken() eine Funktion ist, dass Google prüft Auth-Token und ein Versprechen zurückgibt. Knotenausgang ist die folgende:

error in finding token: { CouchbaseError message: 'The key does not exist on the server', code: 13 } 
(node:10961) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): CouchbaseError: The key does not exist on the server 
(node:10961) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. 

, wie Sie das Versprechen Fehler Zweig sehen regelmäßig gefangen wird, wenn es wie erwartet protokolliert, aber ich immer noch die Warnung bekommen !!!!

während, wenn ich hängen Sie einfach den Fang so:

verifyPromise.then((login) => { 
     return DB_API.getTokenById(id_token);; 
    }).catch((err) => { 
     log('error in finding token: ', err); 
    }); 

keine Warnung gegeben !!! Ich denke, dass ich etwas subtil vermisse, aber ich verstehe nicht, was sein könnte. Einige haben irgendwelche Hinweise? danke im voraus

Antwort

2

Dieses Problem tritt auf, weil es nicht das ursprüngliche Versprechen ist, das schließlich scheitert, es ist das then()! Sie sind nicht das Ergebnis von

verifyOkPromise.then((dbRes) => { 
    log('loggin res in finding token: ', dbRes); 
}); 

Speicherung Es ist der Ruf zu then() hier, die letztlich die Auflösung der Versprechen Kette auslöst. Sie versuchen, den Catch vom ursprünglichen Aufruf zu verarbeiten, aber es ist die Kette, die fehlschlägt. Hier sind drei vereinfachte Versionen von dem, was Sie versuchen zu tun. Die erste entspricht Ihrem Workflow. Die zweite entspricht, wie diese normalerweise geschrieben werden (aber ein Muster, das Sie nicht verwenden wollten). Der dritte schreibt das Muster neu, damit es ordnungsgemäß funktioniert, jedoch mit den Ergebnissen, die den Variablen zugewiesen sind.

let Promise = require('bluebird'); 

function forceReject() { 
    return Promise.reject('deliberately failed'); 
} 

let p = forceReject('12345'); 

// This will produce an Unhandled Rejection error 
/* 
p.then(res => { console.log('succeeded: ', res); }); 
p.catch(err => { console.log('failed: ', err); }); 
*/ 

// This will work but it's not the pattern you prefer 
/* 
p.then(res => { 
    console.log('succeeded: ', res); 
}).catch(err => { 
    console.log('failed: ', err); 
}); 
*/ 

// This will also work! Note the assignment of the result of p.then()... 
let q = p.then(res => { console.log('succeeded: ', res); }); 
q.catch(err => { console.log('failed: ', err); }); 
+0

große Antwort Ich habe wirklich den Punkt vermisst. Danke vielmals. – user1658162

1

Sie verwenden Node 7.5, sollten Sie in Betracht ziehen async/await. Chad Antwort ist gut geschrieben und richtig, aber hier ist, wie ich den Code in Frage schreiben würde:

async function whateverYoureDoing(id_token) { 
    const token = await verifyToken(id_token); 
    // catch will automatically propagate. 
    //You can use regular try/catch and if rethrow your own custom TokenInvalidError object 
    const dbRes = await DB_API.getTokenById(id_token); 
    console.log('loggin res in finding token: ', dbRes); 
} 

Hinweis: Sie müssen nicht mehr .catch hinzufügen und melden Sie sich Fehler mit Versprechungen - das ist der Punkt der unhandledRejection Tracking-Funktion :) Logging sollte generell auf einem Top-Level durchgeführt werden, da Versprechungen sowieso gut funktionieren.

+0

funktioniert es auch so. Ich muss versuchen zu fangen, sonst würde ich die gleiche Warnung bekommen. vielen Dank – user1658162

+0

versuchen { Token = erwarten verifyToken (id_token); versuchen { dbRes = erwarten DB_API.getTokenById (id_token); log ('loggin res in finding token:', dbRes); } catch (Fehler) { log ('Fehler beim Finden des Tokens:', Fehler); /* verifiziertes Token einfügen */ } } catch (Fehler) { log (error); } – user1658162

Verwandte Themen