Использование socket.io с React и Google App Engine - PullRequest
0 голосов
/ 27 сентября 2018

Я создал приложение Node (express) / React, которое использует socket.io и хранилище Redux следующим образом:

import io from "socket.io-client";
import * as types from "../actions/types";
import { cancelReview, startReview } from "./actions";

const socket = io("http://localhost:8080", {
  transports: ["websocket"]
});

export const init = store => {
  socket.on("connect", () => {
    console.log("websocket connection successful...");
    socket.on("cancelReview", (id, name) => {
      cancelReview(store, id, name);
    });
    socket.on("startReview", (id, name) => {
      startReview(store, id, name);
    });
  });
};

Затем эта функция вызывается из store.js следующим образом:

import { createStore, applyMiddleware } from "redux";
import { composeWithDevTools } from "redux-devtools-extension/developmentOnly";
import thunk from "redux-thunk";
import rootReducer from "./reducers";
import { init } from "./socket/socket";

// Initial state
const initialState = {};

// Middleware
const middleware = [thunk];

const store = createStore(
  rootReducer,
  initialState,
  composeWithDevTools(applyMiddleware(...middleware))
);

init(store);

export default store;

Все отлично работает на моем локальном компьютере, но теперь, после некоторых исследований, я понимаю, что это не будет работать на движке приложений Google, потому что вместо http://localhost:8080 мне нужно получить фактический IP-адрес из метаданных Googleсервер и передать в EXTERNAL_IP + ":65080".Таким образом, я могу получить внешний IP-адрес в моем экспресс-приложении следующим образом:

const METADATA_NETWORK_INTERFACE_URL =
  "http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip";

function getExternalIp(cb) {
  const request = axios.create({
    baseURL: METADATA_NETWORK_INTERFACE_URL,
    headers: { "Metadata-Flavor": "Google" }
  });
  request
    .get("/", (req, res) => {
      return cb(res.data);
    })
    .catch(err => {
      console.log("Error while talking to metadata server, assuming localhost");
      return cb("localhost");
    });
}

Однако, если я передам это значение в свою функцию рендеринга, как показано ниже, React создаст реквизит для передачи в компоненты (насколько я понимаю из информации, которую я смог найти):

  app.get("*", (req, res) => {
    getExternalIp(extIp => {
      res.render(path.resolve(__dirname, "client", "build", "index.html"), {
        externalIp: extIp
      });
    });

Я не могу получить доступ к этому значению через глобальное окно.Итак, мой вопрос: как мне получить доступ к этому внешнему IP-адресу из инициализации моего магазина, поскольку это не фактический компонент React?

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...