1

版本: 8.0.3

环境:

  • 操作系统: macOS Big Sur 11.5.2
  • 浏览器: 谷歌浏览器版本 92.0.4515.159(官方版本)(x86_64)
  • Node.js: 13.14.0

你好,

我将 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();
        });
    };

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

谢谢!

4

1 回答 1

1

根据GitHub 问题澄清并解决了问题。

基本上最好使用中间件来解决此类问题(传入参数验证),可以这样完成:

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

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

        next();
      }
    });

这个插件也是由 lib 维护者提供给我的,作为异步插件实现的一个例子,也许它对其他人有帮助。

于 2021-09-03T19:40:16.363 回答