2017-07-28 3 views
1

Ich habe eine Funktion in einem Modul, das die Anfrage-Versprechen-native Modul eine couchdb Datenbank abzufragen verwendet:Node.js: Wie ein rejcted Versprechen zurückzukehren, ohne UnhandledPromiseRejectionWarning zu bekommen

userByEmail: (email) => { 
    const options = { 
    url: `${config.couchdb.url}/medlog/_design/user/_view/by_email_or_userid?key="${email}"`, 
    json: true, 
    }; 

    return rp.get(options) 
    .then(users => users.rows.map(row => row.value)) 
    .catch(reason => Promise.reject(new Error('test'))); 
} 

Ein zweites Modul enthält ein Funktion, die die erste verwendet:

router.get('/checkEmailExistence', (req, res) => { 
    couchdb.userByEmail(req.param('email')) 
    .then((userArray) => { 
     res.status(200).end(userArray.length > 0); // returns 'true' if at least one user found 
    }) 
    .catch((e) => { 
     winston.log('error', e.message); 
     res.status(500).end(e.message); 
}); 

im Fall, dass es keine Datenbankverbindung ist, das Versprechen von der Anfrage-Versprechen-native Modul wird abgelehnt. Ich möchte diese Zurückweisung in der zweiten Funktion abfangen und dem Anrufer einen internen Serverfehler zurückgeben. Um die Zurückweisung aus dem Anfrage-Versprechen-nativen Modul weiterzuleiten, fange ich es in der ersten Funktion und gebe ein neues abgelehntes Versprechen zurück.

Leider bekomme ich immer die Warnung, dass ich eine unbehandelte Versprechen Ablehnung habe. Wie kann ich dieses Problem lösen?


EDIT

Ich habe gerade gesehen, dass ich den falschen Codepfad zum Testen verwendet. Die obige Codierung funktioniert also ohne die Warnung zu erzeugen. Entschuldigung für die Verwirrung.

+0

Im ersten Modul statt '.catch (Grund => Promise.reject (neu Error ('test'))); 'try' .catch (Grund => neuer Fehler ('Test')); ' –

+0

In diesem Fall würde ich ein Versprechen erhalten, das mit der Fehlermeldung gelöst wird. Stattdessen möchte ich ein Versprechen erhalten, das abgelehnt wird. –

+0

Sie können nicht innerhalb "catch" zurückweisen, aber Sie können die folgenden tun '.catch (Grund => neuen Fehler ('test') werfen);' –

Antwort

0

Dies geschieht, weil eine Promise immer etwas zurückgeben muss.

Sie können dieses 'Problem' beheben mit einem return null

router.get('/checkEmailExistence', (req, res) => { 
    couchdb.userByEmail(req.param('email')) 
    .then((userArray) => { 
    res.status(200).end(userArray.length > 0); // returns 'true' if at least one user found 
    return null 
    }) 
    .catch((e) => { 
    winston.log('error', e.message); 
    res.status(500).end(e.message); 
    return null 
    }); 
}); 
Verwandte Themen