Socket.io 使用Molecler runner而不是ServiceBroker将Molecler io与Molecler web集成的示例?

Socket.io 使用Molecler runner而不是ServiceBroker将Molecler io与Molecler web集成的示例?,socket.io,moleculer,Socket.io,Moleculer,我很喜欢使用Molecler runner,而不是在我正在从事的Molecler web项目中创建ServiceBroker实例。运行程序简化了Molecler web的服务设置,所有服务(包括api.service.js文件)的外观和行为都相同,使用module.exports={blah}格式 我可以在api.service.js文件中清晰地定义REST端点,并在适当的服务文件中创建连接的函数。例如别名:{'GET sensors':'sensors.list'}指向sensors.serv

我很喜欢使用Molecler runner,而不是在我正在从事的Molecler web项目中创建ServiceBroker实例。运行程序简化了Molecler web的服务设置,所有服务(包括api.service.js文件)的外观和行为都相同,使用
module.exports={blah}
格式

我可以在api.service.js文件中清晰地定义REST端点,并在适当的服务文件中创建连接的函数。例如
别名:{'GET sensors':'sensors.list'}
指向
sensors.service.js中的
list()
操作/函数。在数组中使用一些虚拟数据,这一切都非常有效

下一步是让服务打开一个套接字并与监听内部设置地址/端口的本地程序对话。其思想是接受来自web的REST调用,通过套接字与本地程序对话以获取一些数据,然后格式化数据并通过REST返回给客户端


但是当我想在moleculer上使用套接字时,我很难找到将moleculer io与基于moleculer runner的设置集成在一起的有用信息和示例。我找到的所有示例都使用ServiceBroker模型。我认为我的谷歌Fu相当不错,但我不知道下一步该去哪里。或者,我可以修改ServiceBroker示例以使用moleculer runner吗?欢迎您提供任何见解或意见。

您的服务是否使用socket.io并不重要。所有服务都以相同的方式声明,即
module.exports={}

下面是socket.io的工作示例

const{ServiceBroker}=require(“分子”);
const ApiGateway=require(“分子网”);
常数SocketIOService=require(“分子io”);
const io=require(“socket.io客户端”);
const IOService={
名称:“api”,
//SocketIOService应位于moleculer web之后
//加载HTTP API网关,以便能够通过以下方式实现“迎宾”操作:
// http://localhost:3000/hello/greeter
mixins:[ApiGateway,SocketIOService]
};
常量HelloService={
姓名:“你好”,
行动:{
迎宾员{
返回“Hello Via Socket”;
}
}
};
const broker=new ServiceBroker();
broker.createService(IOService);
broker.createService(HelloService);
broker.start().then(异步()=>{
常量套接字=io(“http://localhost:3000", {
重新连接延迟:300,
重新连接延迟最大值:300
});
socket.on(“连接”,()=>{
日志(“与网关的连接已建立”);
});
socket.emit(“call”、“hello.greeter”,(error,res)=>{
控制台日志(res);
});
});
要使其与
moleculer runner
一起工作,只需将服务声明复制到
my service.service.js
。例如,您的
api.service.js
可以如下所示:

//api.service.js
module.exports={
名称:“api”,
//SocketIOService应位于moleculer web之后
//加载HTTP API网关,以便能够通过以下方式实现“迎宾”操作:
// http://localhost:3000/hello/greeter
mixins:[ApiGateway,SocketIOService]
}
以及您的
迎宾服务:

//greeter.service.js
module.exports={
姓名:“你好”,
行动:{
迎宾员{
返回“Hello Via Socket”;
}
}
}

如果需要以下链,请运行
npm run dev
moleculer runner--repl--hot services

localhost:3000/sensor/list->sensor.list()->>send message to local program:8071->get response->send response as return message to the REST caller.

然后,您需要将socket io客户端添加到
传感器
服务中(该服务具有
列表()
操作)。添加客户端将允许它通过套接字与“外部世界”通信

检查下面的图片。我想它有你需要的一切。 作为一个骨架,我使用了
moleculer demo
project

我所拥有的:

  • API服务
    API.service.js
    。处理HTTP请求并将其传递给
    sensor.service.js

  • sensor.service.js
    将负责与远程socket.io服务器通信,因此它需要一个socket.io客户端。现在,当
    sensor.service.js
    服务启动时()
我正在与位于端口8071的远程服务器建立连接。在此之后,我可以在服务操作中使用此连接与socket.io服务器通信。这正是我在传感器中所做的。列出操作

  • 我还创建了
    remote server.service.js
    来模拟您的
    socket.io服务器。尽管是一个分子服务,
    sensor.service.js
    通过socket.io协议与之通信


  • 我理解这一点,但正如我在帖子中提到的,我正在寻找不需要ServiceBroker的示例,因为molecular runner(根据文档)已经完成了代理所做的所有工作。我得到了您需要的。这就是为什么我还添加了带有
    api.service.js
    greeter.service.js
    文件的“无代理”示例。无论如何,使用moleculer cli创建一个模板,然后将
    api.service.js
    的内容复制到模板附带的api服务中。好吧……我想我明白了——可能需要更多的咖啡。我得到的mixin部分已经声明了。需要明确的是,当您说“服务声明”时,您是否包括了
    broker.start()
    的内容,并且它需要作为…什么添加到api.service.js中?一种方法?还是“callBefore()”?这仍然不能解决在一个http端口上接收REST调用,然后使用另一个套接字与内部程序通信的问题——尽管我认为我可以根据您的检查得出这一点