【问题标题】:node js script exits prematurelynode js脚本过早退出
【发布时间】:2020-01-14 17:34:57
【问题描述】:

在这里保证新手。

我正在尝试从 asset 数据库中检索 icon_name 字段,Equipment mongodb 中的表
并更新equipments数据库中的icon_id字段,mysql中的equipments表。

我有大约 12,000 条记录,icon_name 字段位于 Equipment

脚本成功运行,但似乎并未遍历所有记录。 当我检查equipments 表时,只更新了大约 3,000 条记录。

我尝试多次运行该脚本,每次似乎都会更新更多记录。

我怀疑数据库连接在所有查询完成之前就关闭了,但由于我使用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()
})

提前致谢。

【问题讨论】:

    标签: mysql node.js mongodb promise sequelize.js


    【解决方案1】:

    代码看起来不错,但是并行生成 12000 个 promise 可能会在数据库连接级别上造成一些问题。我建议批处理并发请求并将它们限制在 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 } });
            });
    

    【讨论】:

    • 效果很好,谢谢。唯一的缺点是它非常慢。大概花了 10 分钟。
    • 事实证明它很慢,因为我没有在代码字段处创建索引。可能与批处理承诺库无关。
    猜你喜欢
    • 1970-01-01
    • 2018-02-12
    • 2019-06-29
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2021-05-09
    相关资源
    最近更新 更多