Mocha mysql knex перед каждой ошибкой: невозможно выполнить блокировку для запуска миграции

0

Вот мой тестовый установочный код

const knex = require('../db').knex

beforeEach(() => knex.migrate.rollback()
  .then(() => knex.migrate.latest())
  .then(() => knex.seed.run())
)

afterEach(() => knex.migrate.rollback()
  .then(() => {})
)

получить следующую ошибку

Knex:warning - Can't take lock to run migrations: Migration table is already locked
Knex:warning - If you are sure migrations are not running you can release the lock manually by deleting all the rows from migrations lock table: knex_migrations_lock
Unhandled rejection MigrationLocked: Migration table is already locked

      1) "before each" hook for "is not allowed"
Knex:warning - Can't take lock to run migrations: Migration table is already locked
Knex:warning - If you are sure migrations are not running you can release the lock manually by deleting all the rows from migrations lock table: knex_migrations_lock
      2) "after each" hook for "is not allowed"

здесь находится db.js

const Knex = require('knex')
const Bookshelf = require('bookshelf')
const config = require('config')

var bookshelf = null
var knex = null

exports.init = () => {
  knex = Knex(config.get('database'))
  if (process.env.NODE_ENV !== 'test') {
    knex.migrate.latest()
  }

  bookshelf = Bookshelf(knex)
  bookshelf.plugin('registry')
  bookshelf.plugin('pagination')
  bookshelf.plugin('bookshelf-camelcase')
  bookshelf.plugin('visibility')

  exports.bookshelf = bookshelf
  exports.knex = knex

}

mocha.opts

--ui bdd
--slow 70
--growl
--recursive
--reporter spec
  • 0
    Если вы запускаете только один тест, это все еще происходит? Вы проводите несколько тестов параллельно? Происходит ли ошибка, если вы не используете seed?
  • 0
    Не уверен, как я могу выполнять тесты параллельно, я просто запускаю nyc _mocha . Да, ошибка все еще происходит, если я закомментирую seed. Иногда я могу запустить несколько тестов, прежде чем один из afterEach / beforeEach завершится неудачно
Показать ещё 1 комментарий
Теги:
mocha
knex.js

2 ответа

0
Лучший ответ

Оказывается, до этого beforeEach крючок занимал много времени из-за mysql.

Используя this.timeout решил это для меня!

beforeEach(async function () {
  this.timeout(60 * 1000)
  await knex.migrate.rollback()
  await knex.migrate.latest()
  return knex.seed.run()
})
0

Удалите все строки в таблице migrations_lock и повторите попытку. Вероятно, какая-то миграция рухнула и оставила замок на месте.

Также вам не нужно делать обратные вызовы. Простого обещания от до/после должно быть достаточно:

const knex = require('../db').knex

beforeEach(() => knex.migrate.rollback()
  .then(() => knex.migrate.latest())
  .then(() => knex.seed.run())
)

afterEach(() => knex.migrate.rollback())

РЕДАКТИРОВАТЬ:

В вашем db init запущен knex.migrate.latest() и не дожидался завершения его перед возвратом функции.

exports.init = () => {
  knex = Knex(config.get('database'))
  if (process.env.NODE_ENV !== 'test') {
    // this starts running migrations and execution continues without waiting that this is ready 
    knex.migrate.latest() 
  }

  bookshelf = Bookshelf(knex)
  bookshelf.plugin('registry')
  bookshelf.plugin('pagination')
  bookshelf.plugin('bookshelf-camelcase')
  bookshelf.plugin('visibility')

  exports.bookshelf = bookshelf
  exports.knex = knex
}
  • 0
    Я уже пытался сделать DELETE from knex_migrations_lock но не повезло. Проблема появляется снова
  • 0
    Этот knex.migrate.latest() никогда не запускается, потому что я запускаю тесты в test env. Тем не менее, я добавил await , спасибо, хороший улов.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню