node.js - Feathers - 通过 Socket.io 发出自定义事件

标签 node.js socket.io feathersjs

我正在尝试在 Feathers Hook 中发出自定义事件。我在钩子(Hook)中尝试了以下操作:

module.exports = function (options = {}) {
  return async context => {

    const { app } = context;

    const groupsService = app.service('groups');
    const groups = await groupsService.find( { query:{ members: context.result.user._id } });
    
    await app.emit('list', groups); // Try 1
    await groupsService.emit('list', groups); // Try 2
    await context.service.emit('list', groups); // Try3
    console.log('====================EMIT====================');

    return context;
  };
};

我还将事件添加到服务中:

module.exports = function (app) {
  this.events = ['list']; // Try 1
  (...)
  // Get our initialized service so that we can register hooks
  const service = app.service('groups');

  service.events = ['list']; // Try 2

  service.hooks(hooks);
};

问题是,该事件永远不会被发出。通过调试,我只能在控制台中看到以下消息:

debug: before app.service('groups').find()

debug: after app.service('groups').find()

====================EMIT====================

但是,该事件永远不会使用 Socket.io 发出。在 channel 中,我将每个事件发送给经过身份验证的用户。我也尝试给大家改过,但没有成功。当我使用 DEBUG=* npm start 运行 Feathers 时,我可以看到该事件从未发出。任何想法?谢谢!

最佳答案

目前这仍然有点挑剔。问题在于,调用 app.use 时,events 数组需要位于服务上。这可以这样完成:

module.exports = function (app) {
  (...)

  app.use('/groups', Object.assign(createService(options), {
    events: [ 'list' ]
  }));

  // Get our initialized service so that we can register hooks
  const service = app.service('groups');

  service.hooks(hooks);
};

然后就可以使用as documented :

groupsService.emit('list', groups)

Feathers 数据库服务已采用 events option所以它看起来像这样:

module.exports = function (app) {
  const options = {
    (...)
    events: [ 'list' ]
  };

  app.use('/groups', createService(options));

  // Get our initialized service so that we can register hooks
  const service = app.service('groups');

  service.hooks(hooks);
};

关于node.js - Feathers - 通过 Socket.io 发出自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50801842/

相关文章:

node.js - 我的 ExpressJS 网站和 socket.io 端口可以使用相同的端口吗?

php - 创建一个 redis 监听器 - 在 php 中可能吗?

node.js - 从 LAN 内部和外部使用 socket.io

node.js - Node 在 Windows 10 上找不到 webpack 模块

node.js - 如何制作带有socket io集群的node js?

javascript - 自定义 cli 生成的feathersjs 服务

feathersjs - 需要在feathersjs中添加多个usernameField

javascript - React 路由器未在重定向上加载组件

javascript - 在response.write中包含一个链接

javascript - 如何在服务 Hook 中检查关联羽毛- Sequelize