首页 > 解决方案 > 为什么feathersjs app.setup方法会破坏websocket连接

问题描述

在 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":{}}

实际的创建查询功能工作并将数据插入到数据库中。

尽管 websocket 连接已断开,只要我在初始化函数中有 app.setup() 方法,任何客户端都无法连接到该服务。

我需要调用 app.setup() 函数以便数据库准备就绪,否则我会出现以下错误:

relation {TABLE} does not exist

欢迎任何建议、提示等。

问候,埃米尔

标签: feathersjsfeathers-sequelize

解决方案


setup旨在使用server您的代码中缺少的参数调用。当你打电话时app.listenapp.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;
    }
}

推荐阅读