在Docker中发布带有奇怪问题的请求[已解决]

yh2wf1be  于 2022-12-29  发布在  Docker
关注(0)|答案(1)|浏览(154)

嗨,我在一个项目中工作,前端使用next.js,后端使用express。我开始连接应用程序,遇到了一个奇怪的问题,当axios尝试发送post请求到API时,我收到了以下错误:

我说奇怪是因为get requests工作正常,我的API有cors config,我在所有项目中使用docker并做了一些测试
服务器.ts(后端)

import express from 'express'
import { adminJs, adminJsRouter } from './adminjs'
import { sequelize } from './database'
import dotenv from 'dotenv'
import { router } from './routes'
import cors from 'cors'

dotenv.config()
const app = express()
app.use(cors())
app.use(express.static('public'))
app.use(express.json())
app.use(adminJs.options.rootPath, adminJsRouter)
app.use(router)
const PORT = process.env.SERVER_PORT || 3000

app.listen(PORT, () => {
    sequelize.authenticate().then(() => console.log('DB connection sucessfull.'))
    console.log(`Server started successfuly at port ${PORT}`)
})

API.ts(前端)

import axios from "axios";

const baseURL = process.env.NEXT_PUBLIC_BASEURL!

const api = axios.create({baseURL})

export type ErrorType ={
    message: string
}

export default api;

发生问题的authService.ts(前端)

const authService = {
    register: async (params: Register) => {
        try {
            const res = await api.post<AxiosResponse<Register>>('/auth/register', params)
            console.log(res)
            return res
        } catch (err) {
            if (!axios.isAxiosError<AxiosError<ErrorType>>(err)) throw err

            console.error(JSON.stringify(err))
            return err
        }
    }
}

export default authService

在Docker中,我使用容器别名和localhost测试请求,并在以下情况下得到以下结果:
在前端使用容器别名获取请求:前端工作岗位要求:在容器内使用curl发出请求时出现问题:作品
在前端使用http://localhost获取请求:前端的问题帖子请求:容器内使用curl的工作后请求:使用 Postman 发出工程邮递请求:作品
docker-compose.yml(前端)

version: '3.9'
services:
  front:
    build:
      context: .
    ports:
    - '3001:3001'
    volumes:
    - .:/onebitflix-front
    command: bash start.sh
    stdin_open: true
    environment:
      - NEXT_PUBLIC_BASEURL=http://api:3000
      - STATIC_FILES_BASEURL=http://localhost:3000
    networks:
      - onebitflix-net

networks:
  onebitflix-net:
    name: onebitflix-net
    external: true

docker-compose.yml(后端)

version: '3.8'

services:
  api: #I use this alias in frontend
    build: .
    command: bash start.sh
    ports:
      - "3000:3000"
    volumes:
      - .:/onebitflix
    environment:
      NODE_ENV: development
      SERVER_PORT: 3000
      HOST: db
      PORT: 5432
      DATABASE: onebitflix_development
      USERNAME: onebitflix
      PASSWORD: onebitflix
      JWT_SECRET: chave-do-jwt
    depends_on:
      - db
    networks:
      - onebitflix-net
  db:
    image: postgres:15.1
    environment:
      POSTGRES_DB: onebitflix_development
      POSTGRES_USER: onebitflix
      POSTGRES_PASSWORD: onebitflix
    ports:
      - "5432:5432"
    networks:
      - onebitflix-net

networks:
  onebitflix-net:
    name: onebitflix-net
    external: true

volumes:
  db:
guykilcj

guykilcj1#

当您从浏览器连接到API时,需要使用可从浏览器访问的URL。
docker-compose服务名只能在docker网络上使用,因此不能从网络外部使用api作为主机名。
所以你需要改变

NEXT_PUBLIC_BASEURL=http://api:3000

NEXT_PUBLIC_BASEURL=http://localhost:3000

在您docker-compose.yml文件中

相关问题