Socket.io в nodejs подключается, когда я вызываю localhost:8002, но не работает, когда я вызываю 192.168.2.10:8002, он не подключается.

Вопрос или проблема

Я тестирую свои изменения на https://piehost.com/socketio-tester

Мой код:

index.js:

const express = require("express");
const path = require("path");
const http = require("http");
const bodyParser = require("body-parser");
const cors = require("cors");
const dotenv = require("dotenv");
dotenv.config();

const sequelize = require("../configs/db-config");

const { initSocket } = require("../configs/socket-config");

// Импортируйте все маршруты здесь
const userRoutes = require("./user/user.routes");
const otpRoutes = require("./otp/otp.routes");
const coyoteRoutes = require("./coyote/coyote.routes");
const voucherRoutes = require("./voucher/voucher.routes");

require("./cronjobs/subscriptionExpiry");

const app = express();
const server = http.createServer(app);

// НАСТРОЙКА ПРИЛОЖЕНИЯ
const port = process.env.PORT || 8000;

// Установите EJS в качестве движка представлений
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views")); // Путь к каталогу представлений

app.use(cors());
app.use(express.json());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// Маршрут по умолчанию для отображения документации API
app.get("/", (req, res) => {
  res.render("api_documentation", {
    endpoints: [
      { method: "POST", path: "/api/v2/user/signup", description: "Регистрирует нового пользователя", params: ["fullName", "email", "password", "dob", "profilePic"] },
      { method: "POST", path: "/api/v2/user/signin", description: "Вход пользователя и возврат JWT токена", params: ["email", "password", "FCMToken"] },
      { method: "POST", path: "/api/v2/user/resetPassword", description: "Сбрасывает пароль пользователя", params: ["email", "password"] },
      { method: "GET", path: "/api/v2/user/getFeed", description: "Получает ленту на основе местоположения пользователя", params: ["latitude", "longitude", "radius"] },
      { method: "PUT", path: "/api/v2/user/editUser", description: "Редактирует профиль пользователя", params: ["userId", "profilePic", "updatedData"] },
      { method: "GET", path: "/api/v2/user/getReportsHistory", description: "Получает историю отчетов пользователя", params: ["userId"] },
      { method: "GET", path: "/api/v2/user/getUsers", description: "Получает пользователей или конкретного пользователя", params: ["userId (необязательно)"] },
      { method: "POST", path: "/api/v2/user/addSubscription", description: "Добавляет подписку для пользователя", params: ["userId", "voucherId", "paymentIntentId"] },
      { method: "POST", path: "/api/v2/otp", description: "Генерирует OTP для пользователя", params: ["email"] },
      { method: "POST", path: "/api/v2/voucher/redeem", description: "Обменивает ваучер на кредиты", params: ["voucherCode", "userId"] },
      { method: "DELETE", path: "/api/v2/user/account", description: "Удаляет учетную запись пользователя", params: ["userId"] },

      // Добавьте другие соответствующие конечные точки здесь на основе вашей кодовой базы
    ],
  });
});

// Используйте маршруты здесь
app.use("/api/v2/user", userRoutes);
app.use("/api/v2/otp", otpRoutes);
app.use("/api/v2/coyote", coyoteRoutes);
app.use("/api/v2/voucher", voucherRoutes);

// Соединение Sequelize с БД
sequelize
  .sync()
  .then(() => {
    console.log("База данных успешно синхронизирована");
  })
  .catch((err) => {
    console.error("Не удалось подключиться к базе данных:", err);
  });

initSocket(server);

server.listen(port, '0.0.0.0', () => console.log(`Сервер работает на порту ${port}`));

и мой socket-config.js:

let io; // Объявите io на более высоком уровне
const userService = require("../app/user/user.service");
const coyoteService = require("../app/coyote/coyote.service");

const initSocket = (server) => {
  io = require("socket.io")(server, {
    cors: {
      origin: "*", // Настройте это по мере необходимости
      methods: ["GET", "POST"],
    },
  });

  io.on("connection", (socket) => {
    console.log("Новый клиент подключен");

    socket.on("updateUserLocation", async (locationPayload) => {
      try {
        let { userId, latitude, longitude, radius } =
          JSON.parse(locationPayload);

        if (!userId || !latitude || !longitude) {
          socket.emit(
            "socketError",
            JSON.stringify({
              message: "userId, latitude, longitude обязательны для присоединения к комнате",
            })
          );
          return;
        }

        if (!radius) radius = 400;

        const userUpdated = await userService.editUserProfile(
          userId,
          { latitude: latitude, longitude: longitude },
          null
        );
        if (!userUpdated.status)
          socket.emit(
            "updationError",
            JSON.stringify({ message: userUpdated.message })
          );

        const filterOptions = {
          latitude: latitude,
          longitude: longitude,
          radius: radius,
        };

        //теперь получаем новую ленту
        const feedFetch = await coyoteService.findCoyotesWithinRadius(filterOptions);

        //теперь возвращаем сущность
        socket.emit(
          "locationUpdated",
          JSON.stringify({
            message: "Местоположение успешно обновлено",
            feed: feedFetch,
          })
        );
      } catch (error) {
        console.error("К комнате не удалось присоединиться");
        socket.emit(
          "socketError",
          JSON.stringify({
            message: error.message,
          })
        );
        return;
      }
    });

    socket.on("disconnect", () => {
      console.log("Клиент отключен");
    });
  });

  return io;
};

// Экспортируйте функцию, которая возвращает инициализированный экземпляр io
const getIoInstance = () => {
  if (!io) {
    throw new Error("Socket.io не инициализирован. Пожалуйста, сначала вызовите initSocket.");
  }
  return io;
};

module.exports = {
  initSocket,
  getIoInstance,
};

Я протестировал все, что GPT попросил меня сделать, но ничего не работает.

Ответ или решение

Проблема подключения Socket.io с 192.168.2.10:8002

Введение

Ситуация, о которой вы упоминаете, связана с тем, что ваше приложение на Node.js с использованием Socket.io корректно работает на локальном адресе localhost:8002, но сталкивается с проблемами при подключении через IP-адрес 192.168.2.10:8002. Давайте глубже проанализируем возможные причины данной проблемы и предложим пути её решения.

Возможные Причины

  1. Настройки CORS
    Проверка CORS (Cross-Origin Resource Sharing) является одной из первых вещей, которые требуется проверить. В вашем коде вы указали origin: "*", что должно разрешать подключения с любых источников. Тем не менее, стоит убедиться, что клиент действительно использует этот заголовок в запросах. Попробуйте задать более специфичный источник, если это возможно.

    cors: {
       origin: "http://192.168.2.10:8002", // специфицируйте источник
       methods: ["GET", "POST"],
    }
  2. Сетевые настройки
    Возможно, есть сетевые ограничения, блокирующие доступ по IP-адресу. Убедитесь, что:

    • Сервер, на котором работает ваше приложение, доступен по IP-адресу 192.168.2.10, и этот IP-адрес правильно настроен.
    • Никакие фаерволы или правила безопасности не блокируют порт 8002.
  3. Настройки сервера
    При вызове server.listen(port, '0.0.0.0'...), вы успешно открываете сервер для связи. Однако, если вы столкнулись с проблемами, попробуйте поменять 0.0.0.0 на 192.168.2.10 и протестируйте доступ снова. Это может помочь в отладке, исключив ошибки, связанные с сетевыми интерфейсами.

  4. Проверка клиентского кода
    Если вы используете клиентский код для подключения к вашему серверу Socket.io, убедитесь, что он настроен на использование правильного адреса. Например:

    const socket = io("http://192.168.2.10:8002");

Рекомендации по Диагностике

  • Тестирование на локальной сети: Если у вас есть доступ к другому устройству в той же локальной сети, попробуйте выполнить подключение к 192.168.2.10:8002 из браузера или другого клиента для тестирования.

  • Логи и отладка: Включите расширенное логгирование на стороне сервера. Это позволит вам видеть, получает ли сервер какие-либо запросы и где происходит сбой межсетевого взаимодействия.

  • Используйте инструменты анализа сети: Инструменты вроде telnet могут помочь проверить доступность порта. Например:

    telnet 192.168.2.10 8002

Заключение

Несмотря на то что использование локального хоста работает без проблем, необходимо провести тщательную проверку всех сетевых настроек и конфигураций, чтобы установить виновника проблемы подключения по IP-адресу. Следуя предложенным рекомендациям и основным шагам диагностики, вы сможете справиться с данной проблемой и обеспечить стабильное соединение для вашего приложения.

Если проблемы сохраняются, рассмотрите возможность предоставления дополнительных сведений о клиентском коде и конфигурациях сети для более детального анализа.

Оцените материал
Добавить комментарий

Капча загружается...