Mensaje de error completo:connect ECONNREFUSED 127.0.0.1:30561 at TCPConnectWrap.afterConnect
La solicitud de axios se ejecuta en un entorno Node.js (Next.js), que es donde ocurre el error, extrañamente la solicitud de axios funciona perfectamente bien cuando se ejecuta en el navegador.
Mi componente (que se ejecuta en Node.js) que llama axios:
import axios from 'axios'
import Router from 'next/router'
import React, { Component } from 'react'
import { initializeStore } from '~/reducers'
import { authenticate } from '~/actions/auth'
import { getCookieByName } from '~/helpers/cookie'
const isServer = typeof window === 'undefined'
const __NEXT_REDUX_STORE__ = '__NEXT_REDUX_STORE__'
function getOrCreateStore(initialState) {
// Always make a new store if server, otherwise state is shared between requests
if (isServer) {
return initializeStore(initialState)
}
// Create store if unavailable on the client and set it on the window object
if (!window[__NEXT_REDUX_STORE__]) {
window[__NEXT_REDUX_STORE__] = initializeStore(initialState)
}
return window[__NEXT_REDUX_STORE__]
}
export default App => {
return class AppWithRedux extends Component {
static async getInitialProps(appContext) {
const reduxStore = getOrCreateStore()
appContext.ctx.reduxStore = reduxStore
let appProps = {}
if (typeof App.getInitialProps === 'function') {
appProps = await App.getInitialProps(appContext)
}
const JWT = (isServer ? getCookieByName('JWT', appContext.ctx.req.headers.cookie) : getCookieByName('JWT', document.cookie))
const pathname = appContext.ctx.pathname
//set axios baseURL
axios.defaults.baseURL = (isServer ? `${appContext.ctx.req.headers['x-forwarded-proto']}://${appContext.ctx.req.headers.host}` : window.location.origin)
//if user has a JWT
if(JWT){
axios.defaults.headers.common['Authorization'] = `Bearer ${JWT}`
//get user from API layer
reduxStore.dispatch(authenticate())
}
return {
...appProps,
initialReduxState: reduxStore.getState()
}
}
constructor(props) {
super(props)
this.reduxStore = getOrCreateStore(props.initialReduxState)
}
render() {
return <App {...this.props} reduxStore={this.reduxStore} />
}
}
}
EspecíficamentereduxStore.dispatch(authenticate())
Y mi llamada axios real (usando el procesador redux), mirando el authenticate
método:
import axios from 'axios'
import { setCookieByName } from '~/helpers/cookie'
const BASE_URL = '/api/auth'
export const TYPE_REGISTER = 'TYPE_REGISTER'
export const TYPE_AUTHENTICATE = 'TYPE_AUTHENTICATE'
export const register = values => (dispatch) => {
return axios.post(`${BASE_URL}/register`, values)
.then(function({data: {token, user}}){
setCookieByName('JWT', token, 365)
dispatch({
type: TYPE_REGISTER,
payload: user
})
})
}
export const authenticate = () => (dispatch) => {
return axios.post(`${BASE_URL}/me`)
.then(function({data: {user}}){
dispatch({
type: TYPE_AUTHENTICATE,
payload: user
})
})
.catch(function(err){
console.log(err)
dispatch({
type: TYPE_AUTHENTICATE,
payload: {}
})
})
}
Estoy ejecutando mi clúster de Kubernetes local usando Docker para Mac y se accede a mi controlador Ingress en http://kludge.info:30561
. Mi dominio está asignado 127.0.0.1 kludge.info
localmente para permitir que el controlador de Ingress acceda al contenedor. Mi teoría es que cuando envío una solicitud, http://kludge.info:30561/api/auth/me
por ejemplo, el contenedor acoplable que ejecuta la aplicación Node.js cree que es una solicitud a localhost (dentro del contenedor) y genera un error de conexión. Tenga en cuenta que la aplicación Node.js dentro del contenedor se ejecuta en http://localhost:8080
. Básicamente, estoy ejecutando localhost en mi máquina y localhost dentro de la instancia de Node. ¿Cómo podría enviar una solicitud al exterior http://kludge.info:30561/
donde se está ejecutando el controlador de Ingress?
También configuré baseURL
en axios, pero no resuelve el problema. Mi controlador de entrada tiene una ruta /api
que apuntará a una instancia de PHP, por lo que necesito que mi llamada axios de Node.js llegue a eso dentro de su contenedor. Cualquier ayuda sería muy apreciada.
Cuando ejecuté mi clúster K8 en Minikube no tuve este problema; sin embargo, minikube le proporciona la IP de la VM, mientras que Docker for Desktop la usa localhost
directamente en su máquina.