node js скрипт завершается преждевременно - PullRequest
0 голосов
/ 14 января 2020

Обещание новичка ie здесь.

Я пытаюсь извлечь поле icon_name из базы asset, таблицу Equipment в mongodb
и обновить поле icon_id в equipments база данных, equipments таблица в mysql.

У меня около 12 000 записей с полем icon_name в Equipment.

Сценарий выполняется успешно, однако, похоже, что go через все записи. Когда я проверяю таблицу equipments, обновляется только около 3000 записей.

Я пытался запустить сценарий несколько раз, и, похоже, каждый раз обновляется еще несколько записей.

Мое подозрение соединение с базой данных закрыто до того, как все запросы завершены, но поскольку я использую Promise.all, я не знаю, почему это произошло.

Вот сценарий

const _ = require('lodash'),
    debug = require('debug')('update'),
    Promise = require('bluebird')

const asset = require('../models/asset'),
    equipments = require('../models/equipments')

const Equipment = asset.getEquipment(),
    my_equipments = equipments.get_equipments(),
    icons = equipments.get_icons()

Promise.resolve()
.then(() => {

    debug('Retrieve asset equipments, icons')
    return Promise.all([
        icons.findAll(),
        Equipment.find({ icon_name: { $ne: null } })
    ])
})
.then(([my_icons, asset_equipments]) => {
    debug('Update equipments')
    const updates = []

    console.log(asset_equipments.length)
    asset_equipments.forEach((aeq, i) => {

        const icon_id = my_icons.find(icon => icon.name === aeq.icon_name).id
            up = my_equipments.update(
                { icon_id },
                { where: { code: aeq.eq_id } }
            )

        updates.push(up)
    })


    return Promise.all(updates)
})
.then(() => {
    debug('Success: all done')
    asset.close()
    equipments.close()
})
.catch(err => {
    debug('Error:', err)
    asset.close()
    equipments.close()
})

Заранее спасибо.

1 Ответ

1 голос
/ 14 января 2020

Код выглядит нормально, но параллельное создание 12000 обещаний может вызвать проблемы на уровне соединения с базой данных. Я бы предложил пакетировать параллельные запросы и ограничить их, скажем, до 100. Вы можете использовать batch-promises (https://www.npmjs.com/package/batch-promises)

В основном что-то вроде

return batchPromises(100, asset_equipments, aeq => {
            const icon_id = my_icons.find(icon => icon.name === aeq.icon_name).id;
      return my_equipments.update({ icon_id }, { where: { code: aeq.eq_id } });
        });
...