Ste*_*ris 5 vue.js docker-compose axios nuxt.js
我正在设置一个全栈应用程序,其中 nuxt js 运行我的客户端代码,express js 运行我的 api,mysql 作为我的数据库。为了运行所有这些进程,我一直在使用 docker,更具体地说是 docker-compose。经过大量配置后,我已经让所有三个映像一起运行。但有一个问题,我不知道如何使用 nuxt/axios 调用我的 api。
我尝试了很多不同的策略。我的 Express api 可供“外部世界”使用http://localhost:8080
,因此我设置了 axiosbaseURL
来反映这一点。我在一些 nuxt js 中间件中运行了一些测试 axios gets ,并不断收到连接拒绝错误。我终于发现我可以使用 docker-compose 网络来连接我的前端和后端,所以我将我的 axios 重新映射baseURL
到http://api:8080
(api 是我的 docker-compose 映像的名称),并且在 nuxt js 中间件的 axios 请求中,它就像魅力一样。后来我在写一些代码,想用vue方法发送axios请求。尽管中间件中的 axios 请求正在处理此问题baseURL
,但该方法中的新 axios 请求给出了错误
commons.app.js:434 选项http://api:8080/api/v1/get/colors net::ERR_NAME_NOT_RESOLVED
我尝试将 axios baseURL 更改回 localhost,现在方法中的 axios 请求可以工作,但中间件中的 axios 请求不起作用。
docker-compose.yml
version: "3.3"
services:
mysql:
container_name: mysql
image: mysql:5.7
environment:
MYSQL_USER: ${MYSQL_DEV_USER}
MYSQL_PASSWORD: ${MYSQL_DEV_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DEV_DATABASE}
MYSQL_ROOT_PASSWORD: ${MYSQL_DEV_ROOT_PASSWORD}
ports:
- 3306:3306
restart: always
volumes:
- mysql_data:/var/lib/mysql
- ./database/create_db.sql:/docker-entrypoint-initdb.d/create_db.sql
- ./database/insert_db.sql:/docker-entrypoint-initdb.d/insert_db.sql
api:
container_name: api
depends_on:
- mysql
links:
- mysql
build:
context: ./backend
dockerfile: Dockerfile-dev
environment:
NODE_ENV: development
MYSQL_USER: ${MYSQL_DEV_USER}
MYSQL_PASSWORD: ${MYSQL_DEV_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DEV_DATABASE}
MYSQL_HOST_IP: mysql
PORT: ${API_PORT}
HOST: ${API_HOST}
expose:
- 8080
ports:
- 8080:8080
volumes:
- ./backend:/app
command: npm run dev
frontend:
container_name: frontend
depends_on:
- api
links:
- api
build:
context: ./frontend
dockerfile: Dockerfile-dev
environment:
NUXT_PORT: 3000
NUXT_HOST: 0.0.0.0
NODE_ENV: development
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
API_HOST: api
API_PORT: ${API_PORT}
API_PREFIX: ${API_PREFIX}
expose:
- 3000
ports:
- 3000:3000
volumes:
- ./frontend:/app
command: npm run dev
volumes:
mysql_data:
Run Code Online (Sandbox Code Playgroud)
nuxt.config.js
version: "3.3"
services:
mysql:
container_name: mysql
image: mysql:5.7
environment:
MYSQL_USER: ${MYSQL_DEV_USER}
MYSQL_PASSWORD: ${MYSQL_DEV_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DEV_DATABASE}
MYSQL_ROOT_PASSWORD: ${MYSQL_DEV_ROOT_PASSWORD}
ports:
- 3306:3306
restart: always
volumes:
- mysql_data:/var/lib/mysql
- ./database/create_db.sql:/docker-entrypoint-initdb.d/create_db.sql
- ./database/insert_db.sql:/docker-entrypoint-initdb.d/insert_db.sql
api:
container_name: api
depends_on:
- mysql
links:
- mysql
build:
context: ./backend
dockerfile: Dockerfile-dev
environment:
NODE_ENV: development
MYSQL_USER: ${MYSQL_DEV_USER}
MYSQL_PASSWORD: ${MYSQL_DEV_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DEV_DATABASE}
MYSQL_HOST_IP: mysql
PORT: ${API_PORT}
HOST: ${API_HOST}
expose:
- 8080
ports:
- 8080:8080
volumes:
- ./backend:/app
command: npm run dev
frontend:
container_name: frontend
depends_on:
- api
links:
- api
build:
context: ./frontend
dockerfile: Dockerfile-dev
environment:
NUXT_PORT: 3000
NUXT_HOST: 0.0.0.0
NODE_ENV: development
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
API_HOST: api
API_PORT: ${API_PORT}
API_PREFIX: ${API_PREFIX}
expose:
- 3000
ports:
- 3000:3000
volumes:
- ./frontend:/app
command: npm run dev
volumes:
mysql_data:
Run Code Online (Sandbox Code Playgroud)
Nuxt中间件
axios: {
baseURL: 'http://api:8080/api/v1'
},
Run Code Online (Sandbox Code Playgroud)
努克斯方法
export default async function({ app, redirect, error }) {
try {
const response = await app.$axios.$get('/auth/login')
if (!response.success) {
throw new Error(response.message)
}
redirect('/admin')
} catch (err) {
console.log(err)
await app.$auth.logout()
error({ message: err.message, statusCode: 500 })
}
}
Run Code Online (Sandbox Code Playgroud)
非常感谢大家!
PS这是我的第一个堆栈溢出问题!
Nuxt的Axios模块提供了两种URL前缀的配置选项,一种用于服务器,一种用于浏览器。
axios: {
baseURL: 'http://api:8080/api/v1',
browserBaseURL: 'http://localhost/8080/api/v1'
},
Run Code Online (Sandbox Code Playgroud)