Así que creé una aplicación web de pila MERN y estoy usando Docker. una imagen para mi aplicación de reacción y una imagen para la aplicación rápida. mi base de datos todavía está en la etapa de producción y está en Mlab. Puede que no sea relevante, pero quiero proporcionar información completa para obtener mi respuesta exacta. aquí están mis archivos de configuración de Docker:

Backend Dockerfile:

FROM node

WORKDIR /app

COPY package.json .
COPY package-lock.json .

RUN npm install pm2 -g
RUN npm install
RUN npm audit fix

COPY . .
COPY .env .


EXPOSE 2424

CMD ["npm","run","server"]

Dockerfile frontal:

FROM node as builder

RUN mkdir -p /app
RUN chmod -R 777 /app

WORKDIR /app

ENV PATH /app/node_modules/.bin:$PATH

COPY package.json .
RUN npm install

COPY . .
COPY .env .

FROM nginx:stable-alpine
COPY --from=builder /app/build /usr/share/nginx/html 
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Y mi archivo docker-compose:

version: "3"
networks:
  now-net:
    driver: bridge
services:
  nowfront:
    container_name: frontapp
    build:
      context: ./front
      dockerfile: ./Docker/Dockerfile
    volumes:
      - "./front:/app"
      - "/app/node_modules"
    ports:
      - 60:80
    stdin_open: true
    tty: true
    restart: always
    environment:
      - CHOKIDAR_USEPOLLING=true
    networks:
      - now-net
  backend:
    container_name: backapp
    restart: always
    stdin_open: true
    tty: true
    build:
    context: ./backend
    dockerfile: Dockerfile
    volumes:
       - "./backend:/app"
       - "/app/node_modules"
    ports:
      - 40:2424
    networks:
      - now-net

Mi servidor escucha el puerto 40 y el frente escucha el puerto 60. Ambos están en el mismo servidor. por ejemplo HTTP://222.222.22.22:40 y HTTP://222.222.22.22:60 Y estoy usando pm2 para ejecutar el servidor usando "pm2 start app.js". en mi aplicación express, he permitido todos los orígenes usando el módulo cors npm:

app.use(cors({ origin: "http://222.222.22.22:60", credentials: true }));
app.use(fileupload({ useTempFiles: true }));
app.use(express.json({ limit: "200mb" }));
app.use(express.urlencoded({ extended: true, limit: "200mb" }));

Ahora, antes de usar pm2, todo funcionaba bien. después de usar pm2, aparece este error cada vez que hago una solicitud a mi backend. por ejemplo, obtengo este error en las herramientas de desarrollo de Firefox:

"Solicitud de origen cruzado bloqueada: la política de mismo origen no permite la lectura del recurso remoto en http://222.222.22.22:40/api/instruments/get-all-instruments-public. (Razón: la solicitud CORS no se realizó correctamente) "

Y en la pestaña Red: pestaña de red de Firefox

Envío esta solicitud específica como esta:

export const getAllInstrumentsPublic = () => (dispatch) => {
 axios
  .get(`${uri.BaseURI}/api/instruments/get-all-instruments-public`)
  .then((result) => {
     const instruments = result.data;
     dispatch({
        type: types.GET_ALL_INSTRUMENTS,
        payload: instruments,
     });
})
  .catch((err) => {
     dispatch({
       type: types.GET_ERROR,
       payload: err.response ? err.response : {},
     });
  });
};

Ahora la pregunta es simple. ¿Qué estoy haciendo mal?

0
Alireza Azhdari 29 sep. 2020 a las 10:40

2 respuestas

La mejor respuesta

Así que cambié Dockerfile y package.json para ejecutar el servidor con nodemon nuevamente, y ahora funciona bien. Es raro. porque usar pm2 es muy simple y directo y quiero usar pm2 en producción para que el servidor sea confiable. Si alguien puede sugerir una solución completa a mi problema, se lo agradecería.

0
Alireza Azhdari 29 sep. 2020 a las 08:41

¿Ha verificado que el extremo de su servidor realmente coloca el encabezado "Access-Control-Allow-Origin" configurado en la dirección correcta en su respuesta? También puede intentar configurarlo en '*' en lugar de la dirección IP solo para verificar que funciona.

PD: Creo que su servicio frontend en su archivo docker-compose no está sangrado correctamente, mientras que el servicio backend sí lo está.

0
wesley.buijsman 29 sep. 2020 a las 08:30