UnhandledPromiseRejectionWarning асинхронное ожидание

Ниже приведен мой код для функции onDisconnect на сервере graphql (apollo-server) (но не специфичен для graphql). Он содержит транзакцию postgres, которая используется через адаптер DB. Код работает, но я продолжаю получать предупреждения всякий раз, когда возникают ошибки из ожидания. Ниже мой код, а также предупреждения. Я новичок в async/await, не знаю, что я сделал не так.

onDisconnect: () => {
    try {
        DB.tx(async t => {
                const do_something = await t.any(`SELECT *
                                                  FROM something`, []).catch((e) => { throw `error deleting socket` })
                ... more awaits here ...
                console.log(do_something)
            }
        })
    } catch (error) {
        console.log(error)
    }
},


(node:5640) 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: 3)
(node:5640) [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.

Я также пробовал следующее:

onDisconnect: () => {
    try {
        return DB.tx(async t => {
                const do_something = await t.any(`SELECT *
                                                  FROM something`, []).catch((e) => { throw `error deleting socket` })
                ... more awaits here ...
                console.log(do_something)
                return {
                    success: 1
                }
            }
        })
    } catch (error) {
        console.log(error)
        throw error
    }
},

Экспорт как функция для других случаев работает без предупреждения, например:

export function do_another_thing(...) {
        try {
            return DB.tx(async t => {
                    const do_something = await t.any(`SELECT *
                                                      FROM nothing`, []).catch((e) => { throw `error fetching data` })
                    ... more awaits here ...
                    console.log(do_something)
                    return {
                        success: 1
                    }
                }
            })
        } catch (error) {
            console.log(error)
            throw error
        }
    },

person pewpewlasers    schedule 30.11.2018    source источник


Ответы (1)


Вы должны catch await напрямую:

 export function do_another_thing(...) {
   return DB.tx(async t => {
     try {
       const do_something = await t.any(`SELECT * FROM nothing`, []).catch((e) => { throw `error fetching data` })
       //.. more awaits here ...
       console.log(do_something)
       return {
         success: 1
       };          
    } catch(error) {
       console.log(error);
       // handle the error properly!
    }
 });

}

Подсказка: повторное создание не обрабатывается...

person Jonas Wilms    schedule 30.11.2018
comment
Но эта функция экспорта, как я уже упоминал в вопросе, работает без предупреждений. У меня проблемы только с графом onDisconnect сверху, который ничего не ожидает взамен - person pewpewlasers; 30.11.2018
comment
@pewpewlasers вы не обрабатываете ошибки во всех трех случаях. - person Jonas Wilms; 30.11.2018
comment
Я немного запутался, небольшой указатель того, как это сделать в первом сценарии, где мне действительно не нужно ничего возвращать (успех или неудача)? Кроме того, в моем сценарии мне действительно не нужно обрабатывать ошибку, так что в третьем сценарии недостаточно повторного броска? - person pewpewlasers; 30.11.2018