Почему метод flesjs app.setup разрывает соединение с веб-сервером

В файле App.js это последние несколько строк:

app.configure(initialise)
app.configure(enableCronJobs)

module.exports = app

инициализация происходит отсюда (в файле app.js)

const initialise = require('./initialise')

файл инициализации выглядит следующим образом

module.exports = async (app: App) => {
    try {
        app.setup()

        await app.get('sequelizeSync')
        const { total: RolesCount } = await app.service('roles').find()

        if (RolesCount === 0) {
            await Promise.all(
                roles.map(role =>
                    app
                        .service('roles')
                        .create(role, { useSequelizeModel: true }),
                ),
            )
        }
    } catch (e) {
        console.log('initialise', app, e) // eslint-disable-line
    }
}

У меня в консоли появляется следующая ошибка (и она повторяется):

error: Page not found {"type":"FeathersError","name":"NotFound","code":404,"className":"not-found","data":{"url":"/socket.io/?EIO=3&transport=websocket"},"errors":{}}

Фактическая функция создания запросов работает, и данные вставляются в базу данных.

Однако соединение с веб-сокетом прервано, и ни один клиент не может подключиться к службе, если у меня есть метод app.setup () внутри функции инициализации.

Мне нужно вызвать функцию app.setup (), чтобы база данных была готова, иначе у меня будет следующая ошибка:

relation {TABLE} does not exist

Любые предложения, советы и т. Д. Приветствуются.

С уважением, Эмир


person eGlu    schedule 10.04.2019    source источник


Ответы (1)


setup предназначен для вызова с параметром server, который отсутствует в вашем коде. Когда вы звоните app.listen, вызывается app.setup, поэтому вы не хотите звонить здесь setup.

Вместо этого вы можете заменить app.setup своей собственной версией, не забудьте вызвать старую функцию setup.

module.exports = async (app: App) => {
    const oldSetup = app.setup;

    app.setup = function (...args) {
      const result = oldSetup.apply(this, ...args);
      try {
          await app.get('sequelizeSync')
          const { total: RolesCount } = await app.service('roles').find()

          if (RolesCount === 0) {
              await Promise.all(
                  roles.map(role =>
                      app
                          .service('roles')
                          .create(role, { useSequelizeModel: true }),
                  ),
              )
          }
      } catch (e) {
          console.log('initialise', app, e) // eslint-disable-line
      }
      return result;
    }
}
person ccummings    schedule 10.04.2019
comment
Даже если я сделаю это, я все равно получаю следующую ошибку: error: Page not found {type: FeathersError, name: NotFound, code: 404, className: not-found, data: {url: /socket.io/? EIO = 3 & transport = websocket}, ошибки: {}} - person eGlu; 16.04.2019
comment
У вас настроен socket.io? docs.feathersjs.com/api/socketio.html#appconfiguresocketio - person ccummings; 16.04.2019
comment
Да, api сокета работает, он ломается только тогда, когда я добавляю app.setup, как указано выше. - person eGlu; 17.04.2019