Я создал приложение 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?
Заранее спасибо.