【问题标题】:Why is the feathersjs app.setup method breaking websocket connection为什么feathersjs app.setup方法会破坏websocket连接
【发布时间】:2019-04-10 21:31:14
【问题描述】:

在 App.js 文件中,这些是最后几行:

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

module.exports = app

initialise 来自这里(在 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

欢迎提出任何建议、提示等。

问候, 埃米尔

【问题讨论】:

    标签: feathersjs feathers-sequelize


    【解决方案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;
        }
    }
    

    【讨论】:

    • 即使我做了上述,我仍然得到以下错误:error: Page not found {"type":"FeathersError","name":"NotFound","code":404, "className":"not-found","data":{"url":"/socket.io/?EIO=3&transport=websocket"},"errors":{}}
    • 是的,socket api 可以工作,只有当我像上面那样添加 app.setup 时它才会中断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多