首页 > 解决方案 > Docker 和反应代理

问题描述

问题是这样的:我想从节点上运行的后端获取 jwt 令牌。我仍在学习这些东西(来自 php 背景),但如果我理解正确,为了使用 httpOnly cookie,我必须为后端和前端使用相同的 url。这就是为什么我试图在我的反应应用程序中使用代理。

后端和前端在不同的 docker 容器中运行(它们是完全独立的存储库,每个都有自己的 docker-compose 文件)。它们也通过网络连接。

总结一下,到目前为止我所做的事情

const { createProxyMiddleware } = require("http-proxy-middleware");

module.exports = function (app) {
  app.use(
    createProxyMiddleware("/api/*", { target: "http://nodebackend:33445" })
  );
};

在节点服务器内部,我配置了路由:

module.exports = app => {
  const users = require("../controllers/user.controller.js");
  const auth = require("../middleware/auth");
  ... various other routes ...
  app.post("/api/login", users.login)
};

Docker-compose.yml 用于后端:

version: '3.7'

services:
  nodeserver:
    image: node:14
    ports: 
      - 33445:8080
    working_dir: /app
    command: npm start
    volumes:
      - ./app:/app
      - ./app/node_modules:/app/node_modules
    networks:
      - mainnet
    container_name: nodebackend
  
     ... other services such as mysql ...

networks:
  mainnet:
    driver: bridge

和前端部分的 Docker-compose.yml:

version: '3.7'

services:
  frontend:
    image: node:14
    ports: 
      - 3001:3000
    working_dir: /src
    command: npm start
    volumes:
      - ./:/src
    networks:
      - mainnet

networks:
  mainnet:
    external: true

它们似乎已正确连接到网络中(当我执行 docker network inspect 时,我看到了那里的容器)邮递员对后端的请求也有效(我可以收到 jwt 令牌作为响应)。这样那部分就可以正常工作

在反应应用程序中,我有以下代码:

const submitLogin = (event) => {
  event.preventDefault();

  const requestOptions = {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ email: "test@test.com", password: "test" }),
  };
  fetch("/api/login", requestOptions)
    .then((response) => response.json())
    .then((data) => {
       ...do something with the data
    });
};

我已经坚持了好几天了。无论我做什么,我都会收到:

Error occured while trying to proxy: localhost:3001/api/login

有人可以指出我正确的方向,我做错了什么?

标签: node.jsreactjsdockerproxy

解决方案


推荐阅读