簡體   English   中英

本地 MQTT mosquitto 實例連接 ECONNREFUSED 127.0.0.1:1883

[英]Local MQTT mosquitto instance getting connect ECONNREFUSED 127.0.0.1:1883

我正在嘗試通過 docker 和 docker-compose 運行本地 mosquitto 代理、發布者和訂閱者設置,但發布者無法連接到代理。 但是,通過 cli 連接到本地代理可以正常工作。 運行以下設置時出現以下錯誤。

{ Error: connect ECONNREFUSED 127.0.0.1:1883
  at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1088:14)
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 1883 }

本地 dockerized 設置:

docker-compose.yml

version: "3.5"

services:
  publisher:
    hostname: publisher
    container_name: publisher
    build:
      context: ./
      dockerfile: dev.Dockerfile
    command: npm start
    networks:
      - default
    depends_on:
      - broker

  broker:
    image: eclipse-mosquitto
    hostname: mosquitto-broker
    container_name: mosquitto-broker
    networks:
      - default
    ports:
      - "1883:1883"

networks:
  default:

dev.Dockerfile

FROM node:11-alpine

RUN mkdir app
WORKDIR app

COPY package*.json ./

RUN npm ci

COPY ./src ./src

CMD npm start

源代碼/索引.js

const mqtt = require("mqtt");

const client = mqtt.connect("mqtt://localhost:1883");

client.on("connect", () => {
  console.log("Start publishing...");
  client.publish("testTopic", "test");
});

client.on("error", (error) => {
  console.error(error);
});

但是,如果我通過 mqtt-js cli 連接到 mosquitto 代理,它會按預期工作。 例如mqtt sub -t 'testTopic' -h 'localhost'mqtt pub -t 'testTopic' -h 'localhost' -m 'from MQTT.js'

我錯過了什么?

您的發布者容器和代理在兩個不同的容器中運行,這意味着它們是兩台不同的機器,每台機器都有自己的 IP。

您不能使用 localhost:1883 從您的發布者容器調用代理服務,反之亦然,從代理到發布者容器

要訪問代理容器,您必須調用容器 ip 或名稱或服務名稱

在你的情況下改變mqtt.connect("mqtt://localhost:1883"); 值為mqtt.connect("mqtt://broker:1883"); 試一試

在您的 index.js 中,您應該將“localhost”更改為“broker”。 當在容器內時,“localhost”將解析為該特定容器,因此您應該始終使用服務名稱,而 docker 將負責路由到該特定服務。 此外,默認情況下,同一撰寫文件中的所有服務都添加到同一網絡中,因此無需指定。

所以基本上改變這個: const client = mqtt.connect("mqtt://localhost:1883");

對此: const client = mqtt.connect("mqtt://broker:1883");

publisherbroker運行在不同的容器中,這意味着它們具有不同的 IP。

當發布者嘗試在localhost:1883訪問代理時,收到ECONNREFUSED是正常的,因此代理不在同一個容器中。

此時應更換127.0.0.1localhost與經紀人(的服務名broker在這種情況下)。 服務名稱將被解析為代理容器的正確 IP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM