0

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

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

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

但是,当我想将套接字与分子器一起使用时,我很难找到有用的信息和示例,以将分子器 io 与基于分子器运行器的设置集成在一起。我找到的所有示例都使用 ServiceBroker 模型。我认为我的 Google-Fu 非常好,但我不知道下一步该去哪里。或者,我可以修改 ServiceBroker 示例以与分子运行器一起使用吗?欢迎任何见解或意见。

4

2 回答 2

3

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

下面是一个使用 socket.io 的工作示例。

const { ServiceBroker } = require("moleculer");
const ApiGateway = require("moleculer-web");
const SocketIOService = require("moleculer-io");

const io = require("socket.io-client");

const IOService = {
  name: "api",
  // SocketIOService should be after moleculer-web
  // Load the HTTP API Gateway to be able to reach "greeter" action via:
  // http://localhost:3000/hello/greeter
  mixins: [ApiGateway, SocketIOService]
};

const HelloService = {
  name: "hello",

  actions: {
    greeter() {
      return "Hello Via Socket";
    }
  }
};

const broker = new ServiceBroker();

broker.createService(IOService);
broker.createService(HelloService);

broker.start().then(async () => {
  const socket = io("http://localhost:3000", {
    reconnectionDelay: 300,
    reconnectionDelayMax: 300
  });

  socket.on("connect", () => {
    console.log("Connection with the Gateway established");
  });

  socket.emit("call", "hello.greeter", (error, res) => {
    console.log(res);
  });
});

要使其正常工作,moleculer-runner只需将服务声明复制到my-service.service.js. 例如,您api.service.js可能看起来像:

// api.service.js
module.exports = {
  name: "api",
  // SocketIOService should be after moleculer-web
  // Load the HTTP API Gateway to be able to reach "greeter" action via:
  // http://localhost:3000/hello/greeter
  mixins: [ApiGateway, SocketIOService]
}

和您的greeter服务:

// greeter.service.js
module.exports = {
  name: "hello",

  actions: {
    greeter() {
      return "Hello Via Socket";
    }
  }
}

并运行npm run devmoleculer-runner --repl --hot services

于 2020-01-10T14:24:41.893 回答
3

如果你想要以下链: localhost:3000/sensor/list -> sensor.list() -> send message to local program:8071 -> get response -> send response as return message to the REST caller.

然后您需要向您的sensor服务(具有list()操作)添加一个套接字 io 客户端。添加客户端将允许它通过套接字与“外部世界”通信。

检查下面的图像。我认为它有你需要的一切。作为骨架,我使用过moleculer-demo项目。

在此处输入图像描述

我有的:

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

  • sensor.service.js负责与远程 socket.io 服务器通信,因此它需要一个 socket.io 客户端。现在,当sensor.service.js服务完成时,started()我正在与位于端口 8071 的远程服务器建立连接。之后,我可以在我的服务操作中使用此连接与 socket.io 服务器进行通信。这正是我正在做的事情sensor.list

  • 我还创建remote-server.service.js了模拟你的socket.io server. 尽管是分子服务,但sensor.service.js它通过 socket.io 协议与之通信。

于 2020-01-13T10:36:18.650 回答