#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();
}
});
Также этот плагин был предоставлен мне сопровождающим библиотеки в качестве примера реализации асинхронного плагина, возможно, он будет полезен кому-то еще.