Плагины Primus и async

#node.js #primus

Вопрос:

Версия: 8.0.3

Окружающая среда:

  • Операционная система: macOS Big Sur 11.5.2
  • Браузер: Google Chrome Версии 92.0.4515.159 (Официальная сборка) (x86_64)
  • Node.js: 13.14.0

Привет,

Я использую Primus с веб-сайтами, и мне интересно, поддерживает ли он асинхронные плагины. Я просмотрел документы 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();
        });
    };
 

Поэтому мне любопытно, есть ли способ достичь того, что мне нужно, или мне нужно вызвать свой плагин непосредственно в обработчике «соединение».

Спасибо!

Ответ №1:

Проблема прояснена и решена в соответствии с этой проблемой GitHub.

В принципе, для таких проблем лучше использовать промежуточное программное обеспечение (проверка входящих параметров), и это можно сделать следующим образом:

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

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

        next();
      }
    });
 

Также этот плагин был предоставлен мне сопровождающим библиотеки в качестве примера реализации асинхронного плагина, возможно, он будет полезен кому-то еще.