嗨,我在一个项目中工作,前端使用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:
1条答案
按热度按时间guykilcj1#
当您从浏览器连接到API时,需要使用可从浏览器访问的URL。
docker-compose服务名只能在docker网络上使用,因此不能从网络外部使用
api
作为主机名。所以你需要改变
到
在您docker-compose.yml文件中