2017-07-28 55 views
1

我有一個模塊中的功能,使用該請求的承諾,本機模塊來查詢CouchDB的數據庫:的Node.js:如何返回rejcted承諾沒有得到UnhandledPromiseRejectionWarning

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

第二模塊包含一個函數使用第一個:

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

在沒有數據庫連接的情況下,拒絕來自request-promise-native模塊的許諾。我想要的是在第二個函數中捕獲該拒絕,並向調用者返回內部服務器錯誤。爲了拒絕來自request-promise-native模塊的拒絕,我在第一個函數中捕獲它並返回一個新的拒絕承諾。

不幸的是,我總是得到警告,我有一個未處理的承諾拒絕。我該如何解決這個問題?


編輯

我剛看到,我用於測試的代碼路徑錯誤。所以上面的代碼不會產生警告。對困惑感到抱歉。

+0

解決這個 '問題' 在第一個模塊,而不是'.catch(原因=> Promise.reject(新的錯誤( '測試'))); '嘗試'.catch(reason => new Error('test'));' –

+0

在這種情況下,我會得到一個解決錯誤消息的承諾。相反,我想得到一個被拒絕的承諾。 –

+0

你不能在'catch'裏面拒絕,但是你可以這樣做 '.catch(reason => throw new Error('test'));' –

回答

0

發生這種情況是因爲一個Promise 總是必須返回一些東西。

您可以用返回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 
    }); 
});