Primus 和异步插件

Primus and async plugins

版本:8.0.3

环境:

嗨,

我将 Primus 与 websockets 一起使用,我想知道它是否支持异步插件。我查看了 Primus 文档,但没有找到我需要的内容。

基本上我正在尝试将异步函数传递给 Primus 构造函数,如下所示:

 this.primus = new Primus(server, {
      pathname: '/my-path', plugin: {
        'my-validator': {
          server: myAsyncPlugin //this should run only on the server
        }
      }
    });

问题是,如果我这样注册插件,它不起作用,我的插件总是在其他处理程序之后调用,但我希望它在其他事情发生之前执行,因为它会验证一些传入参数。 (我也看了中间件,但我无法让它工作)

所以如果我在构造函数中注册我的插件然后执行以下操作,我的插件将无法工作:

this.primus.on('connection', (spark) => {
      //...do stuff
 });

但是如果我从构造函数中删除插件并使用以下代码,一切都会按预期工作,因为我使用的是异步函数,如下所示:

this.primus.on('connection', async (spark) => {
      //await myPlugin.doStuff();
      //other stuff
});

示例插件代码如下所示:

public doPluginStuff = (primus, options) => {
        primus.on('connection', async (spark) => {
            await exectuteAsyncStuffHere();
        });
    };

所以我很好奇是否有办法实现我需要的东西,或者我是否必须直接在 'connection' 处理程序中调用我的插件。

谢谢!

问题已根据 this GitHub 问题得到澄清和解决。

基本上这种问题还是用中间件比较好(传入参数验证),可以这样来做:

this.primus.use(() => {
      return async (req, res, next) => {

        try {
          if (!await doStuff()) {
            res.destroy();
            return;
          }
        } catch (error) {
          res.destroy();
          return;
        }

        next();
      }
    });

还有 this plugin 是 lib 维护者给我的,作为异步插件实现的例子,也许对其他人有帮助。