【问题标题】:nodejs promises giving Unhandled Promise Rejection which seems to be handled properlynodejs 承诺给出似乎被正确处理的未处理承诺拒绝
【发布时间】:2021-01-31 17:28:28
【问题描述】:

问题是我收到了 UNhandledPromiseRejection 错误,尽管我认为我已经处理了所有情况。代码从 profileRoutes 流向 Controller 再到 Utils,错误首先出现。

profileRoutes.js 内部

router.get('/:username', async (r, s) => {
    try{
        let profileData = await getProfileData(r.params.username);
        s.json({ success: true, payload: profileData });
    }catch(err){
        console.log('ending request processing by responding a error');
        s.status(500).json({ success: false, message: 'err[0].message' });
    }
});

在控制器/index.js 中


const fetchQueue = [getUserRepos];
async function getProfileData(username) {
    let profileData = {};
    try{

        let results = await Promise.all(fetchQueue.map(item => item(username)));
        for (let i = 0; i < results.length; i++) {
            profileData[getKeys[i]] = results[i];
        }
        return profileData;

    }catch(err){
        console.log('error log in controller/index getProfileData function');
        throw err;
    }
}

const getUserRepos = async (username) => {
    
    try {
        // const res = await utils.gqlSender(username, 'userRepos', { createdAt });
        const res = await utils.gqlSender(username, 'userReposData');
        return res.user.repositories;
    } catch (err) {
        console.log('error log in controller/index getUserRepos function');
        throw err;
    }
};


在 utils/index.js 中


const gqlSender = async (username, type, opt = {}) => {
    
    axios.post('', {
        query: gqlQuery(username, type, opt) // generates a needed graphQL query
    }).then(res => {
        if(res.data.errors) {  // this is where the error is recieved and so i reject promise.                     
            console.log('bef@@@re'); 
            return Promise.reject (res.data.errors);
        }
        console.log('###',res.data);
        return res.data;
    }).catch(err => {
        console.log('error in making axios request inside utils/index gqlSender function');
        throw err;
        // return Promise.reject(err);
    });



向/:username发出get请求时的堆栈跟踪是-

error log in controller/index getUserRepos function
error log in controller/index getProfileData function
ending request processing by responding a error
bef@@@re
error in making axios request inside utils/index gqlSender function
(node:11260) UnhandledPromiseRejectionWarning: [object Array]
(node:11260) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:11260) [DEP0018] 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.

我不认为我错过了任何 Promise Rejection。 任何帮助表示赞赏。谢谢。

我以前参考过这些答案 -

【问题讨论】:

  • 从gqlSender移除异步
  • 或保持 async/await try/catch 样式并删除 .then 回调。它也不会返回:/

标签: javascript node.js ecmascript-6 promise


【解决方案1】:

您的gqlSender 函数不是return 将被拒绝的承诺,因此它不会在任何地方处理。你应该写

const gqlSender = (username, type, opt = {}) => {
    return axios.post('', {
//  ^^^^^^
        query: gqlQuery(username, type, opt) // generates a needed graphQL query
    }).then(res => {
        if (res.data.errors) {
            console.log('error in making axios request inside utils/index gqlSender function');
            throw res.data.errors;
        } else {
            console.log('###',res.data);
            return res.data;
         }
    });
};

或

const gqlSender = async (username, type, opt = {}) => {
//                ^^^^^
    const res = await axios.post('', {
        query: gqlQuery(username, type, opt) // generates a needed graphQL query
    });
    if (res.data.errors) {
        console.log('error in making axios request inside utils/index gqlSender function');
        throw res.data.errors;
    } else {
        console.log('###',res.data);
        return res.data;
     }
}

【讨论】:

    猜你喜欢
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多