【问题标题】:Docker Error occured while trying to proxy to: localhost:5000尝试代理到 localhost:5000 时发生 Docker 错误
【发布时间】:2019-07-09 06:57:10
【问题描述】:

在 docker 上使用 express-react 应用程序时出现以下错误。

我提到了这个

React Proxy error: Could not proxy request /api/ from localhost:3000 to http://localhost:8000 (ECONNREFUSED)

而且该解决方案似乎不起作用。

setupProxy.js

const proxy = require('http-proxy-middleware');

module.exports = function(app) {
  app.use(proxy('/auth/github', { target: 'http://[::1]:5000/' }))
  app.use(proxy('/api/users/auth/github', { target: 'http://[::1]:5000/' }))
  app.use(proxy('/api/users/', { target: 'http://[::1]:5000/', "secure": false }))
  app.use(proxy('/api/posts/', { target: 'http://[::1]:5000/' }))
}

Dockerfile

FROM node:8.10.0-alpine
EXPOSE 5000
COPY . /home/app
WORKDIR /home/app
RUN npm install
CMD ["npm", "start"]

docker-compose.yml

# docker-compose.yml
version: "3"
services:
  app:
    build: .
    restart: always
    depends_on:
      - postgres
    ports:
      - 5000:3000
  postgres:
    image: postgres:9.6.8-alpine
    expose:
      - 5432
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: user
      POSTGRES_DB: db

Package.json

{
  "name": "sequelize-demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "client": "cd ./client && npm start ",
    "server": "nodemon app.js  --ignore client",
    "build": "echo 'hello build'",
    "start": "concurrently --kill-others   \"npm run server\" \"npm run client\""
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "async": "^2.6.1",
    "bcrypt": "^3.0.3",
    "body-parser": "^1.18.3",
    "concurrently": "^4.1.0",
    "cookie-parser": "^1.4.3",
    "cookie-session": "^2.0.0-beta.3",
    "cors": "^2.8.5",
    "crypto": "^1.0.1",
    "dotenv": "^6.2.0",
    "express": "^4.16.4",
    "express-flash": "0.0.2",
    "express-session": "^1.15.6",
    "jsonwebtoken": "^8.4.0",
    "morgan": "^1.9.1",
    "nodemailer": "^5.1.1",
    "nodemon": "^1.18.9",
    "passport": "^0.4.0",
    "passport-github": "^1.1.0",
    "passport-github2": "^0.1.11",
    "passport-jwt": "^4.0.0",
    "passport-local": "^1.0.0",
    "pg": "^7.8.0",
    "pg-hstore": "^2.3.2",
    "sequelize": "^4.42.0"
  }
}

app.js

var express = require('express');
var app = express();
var userRoute = require('./routes/users');
var postRoute  = require('./routes/posts');
var bodyParser = require('body-parser');
var logger = require('morgan');
var models = require('./models');
var User = require('./models/user');
var session = require('express-session');
var cookieParser = require('cookie-parser') ;
var cookieSession = require('cookie-session');
var dotenv = require('dotenv');
var env = dotenv.config();
var cors = require('cors');
const port = process.env.PORT || 5000;
const passport = require('passport');
const path = require('path');


// CORS Middleware
app.use(cors());

app.use(logger('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(bodyParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false })); 


app.use(session({
  secret : 'nodeauthsecret',
  resave: false,
 saveUninitialized: true,

}));

app.use(passport.initialize());
app.use(passport.session());
require('./config/passport')(passport);
require('./config/passport-github')(passport);

app.use(function(req, res, next) {
  res.locals.user = req.user; // This is the important line
  console.log(res.locals.user);
  next();
});
// app.use(function(req, res, next) {
//   res.setHeader("Access-Control-Allow-Origin", "*");
//   res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
// });



app.use('/api/users', userRoute )

app.use('/api/posts',  postRoute )




app.listen(port, function() {
  console.log(`Server is running on ${port}`);
});

【问题讨论】:

  • 为什么要发布 5000 端口并尝试连接到 3000?
  • 因为 react 使用 3000 端口,5000 端口处理 express 的 api 请求。此代码有效,如果它不在 docker 上。
  • 为什么使用端口作为3000
  • 对不起,我更新了我的代码,它真的是1] [HPM] Error occurred while trying to proxy request /api/users/user from localhost:5000 to http://localhost:5000/ (ECONNREFUSED) (https://nodejs.org/api/errors.html#errors_common_system_errors)
  • 你能在浏览器中试试http://localhost:5000/api/users/user吗?

标签: node.js reactjs docker


【解决方案1】:

让我们明白这一点:

API 服务器在 docker 容器中的默认端口 5000 上侦听请求。

API服务由docker-compose组成,将节点机器中的端口5000发布到容器中的目标端口3000

然后,客户端服务器被设置为代理API请求到节点机器中的端口5000

显然,容器中的3000 上没有运行任何服务。
您可以通过在docker-compose.yaml 中将其设置为5000 来更正目标端口

  ports:
      - 5000:5000

【讨论】:

  • 好的,让我试试这个,我正在等待这个构建完成。
  • @randal 发生了什么?
猜你喜欢
  • 1970-01-01
  • 2019-11-11
  • 2022-12-16
  • 2022-01-03
  • 1970-01-01
  • 2021-05-22
  • 2023-02-02
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多