Primus 和异步插件
Primus and async plugins
版本:8.0.3
环境:
- 操作系统: macOS Big Sur 11.5.2
- 浏览器: Google Chrome 版本 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();
});
};
所以我很好奇是否有办法实现我需要的东西,或者我是否必须直接在 '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 维护者给我的,作为异步插件实现的例子,也许对其他人有帮助。
版本:8.0.3
环境:
- 操作系统: macOS Big Sur 11.5.2
- 浏览器: Google Chrome 版本 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();
});
};
所以我很好奇是否有办法实现我需要的东西,或者我是否必须直接在 '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 维护者给我的,作为异步插件实现的例子,也许对其他人有帮助。