Невозможно обработать отказ от обещания с помощью mongodb и mongoose - PullRequest
0 голосов
/ 11 июля 2020

У меня есть следующий код, который в основном пропускает этап ввода документа mongodb, если входящие документы уже находятся в базе данных. Однако эта функция вызывает UnhandledPromiseRejectionWarning при попытке закрыть db connection сразу после завершения asyn c.

async dbInsertMany(asset, timeframe, stream){
    try{
        const [currentAssetModel, multiStream] = this._getMultiModel(asset, timeframe, stream);

        // Don't run the db stage if zero length stream received.
        if(!multiStream.length==0){
            // Refactor this into a try..catch..finally block.
            try{
                await currentAssetModel.insertMany(multiStream);
                console.log('<SUCCESS>');
            }catch(err){
                console.log('<ERROR>', err);
            }finally{
                console.log('__DBINSERTMANY:FINALLY__');
            };
        }else{
            // await sleep(1000);
            console.log('[WARNNING] No unique documents to add.');
        }
    }catch(err){
        throw new Error('Application failure has occurred!');
    }
}

Я не уверен, что мне не хватает.

Следующие ниже функции:

async function dbCycle(){
    try{
        let asset = new AssetDatabaseHandler();

        try{
            await asset.dbInsertMany('BTC/EUR', '5m', demoMultiExchangeStream)
            console.log('DB_INSERT_MANY: Finished.');
        }catch(error){
            console.log('DB_INSERT_MANY: [ERROR]', error);
        }
    }catch(failure){
        console.log('[SEVERE_FAILURE]', failure)
    }
};

и

(async () => {
    try{
        await dbConnection.dbConnect();
        console.log('Connected.');

        const result = await dbCycle();
        console.log('> Finished.');

    }catch(err){
        console.log('> Failed.', err);
    }finally{
        // dbConnection.dbDisconnect();
        console.log('Disconnected.');
    }
})();

1 Ответ

0 голосов
/ 12 июля 2020

Метод .exists() возвращает обещание, что я упустил. Ожидание выполнения обещания после отправки запроса устранило проблему. Поскольку я не ждал обещания и закрытия сервера для случаев, когда не было ничего нового для добавления в базу данных, потерянные обещания вызывали необработанное исключение. Примерно как приведенный ниже код, решил проблему:

async checkStates(stream, model){
    let state;
    let states = [];
    for(const item of stream){
        const date = new Date(millisecondsToTimestring(item[0]));
        const ISODate = date.toISOString();
        state = await model.exists({date: ISODate});
        states.push(state);
        // console.log(item, date, state);
    }
    return states;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...