Я запускаю knex seed
в узле и мне нужно выполнить дополнительный запрос к моей базе данных из-за ограничений на моем сервере. Я начинаю привыкать к обещаниям и асинхронности / ожиданию, но мне трудно заставить его работать на нескольких уровнях (что особенно меня отталкивает в этот момент, так это то, что оно, похоже, мешает пакетированию в так, что я не совсем понимаю). Мой seed
файл выглядит так:
exports.seed = async function(knex) {
const fs = require('fs');
const _ = require('lodash');
function get_event_id(location) {
return knex('events')
.where({location: location})
.first()
.then(result => { return result['id']; })
.finally(() => { knex.destroy() })
}
function createImage(row, event_id) {
return {
name: row[4],
event_id: event_id
}
};
async function run_query(line) {
let row = line.split(',');
let event_id = await get_event_id(row[0]);
return createImage(row, event_id);
};
async function run_batch(batch) {
return Promise.all(batch.map(run_query));
}
const file = fs.readFileSync('./data.csv');
const lines = file.toString().replace(/[\r]/g, '').split('\n').slice(1,60); // skip csv header, then run first 59 lines
const batches = _.chunk(lines, 30); // set batch size
let images = await Promise.all(batches.map(run_batch));
console.log(_.flatten(images).length);
};
Моя база данных может обрабатывать 30 запросов одновременно. Все разрешается правильно, если я запускаю один пакет, используя .slice(1,30)
в строке, где определено lines
. Но работа с 60, как указано выше, дает мне ER_TOO_MANY_USER_CONNECTIONS: User already has more than 'max_user_connections' active connections
.
Сценарий завершается, если я изменяю содержимое run_batch
на return batch.map(run_query)
, и возвращает правильное количество записей (поэтому, похоже, что пакетирование выполняется правильно). Но тогда Обещания еще ожидаются. Чего мне не хватает, и есть ли более элегантный способ сделать это?