Bla*_*rov 3 javascript reactjs axios next.js
所以首先我用 baseurl 创建自定义 axios 实例并像这样导出它:
import axios from 'axios';
const instance = axios.create({
baseURL: process.env.BACKEND_URL,
});
instance.defaults.headers.common['Authorization'] = 'AUTH TOKEN';
instance.defaults.headers.post['Content-Type'] = 'application/json';
export default instance;
Run Code Online (Sandbox Code Playgroud)
导入此自定义 axios 实例时,问题出在我的传奇或任何组件中(仅限客户端)。我使用 next-redux-wrapper,当我为我的组件预取数据(使用 getStaticProps)时,一切正常,并且 axios.defaults.baseURL 属性工作正常。然而,问题出在客户端,每当我在任何组件或 saga 中导入相同的 axios 实例但我从让我们说 componentDidMount 调用它时,相同的 axios.default.baseURL 是未定义的,所以如果我想发出请求我必须输入完整的后端 + 查询 URL。可能是什么问题?例子:
export function* fetchTPsSaga() {
try {
console.log(axios.defaults.baseURL);
const url = `/training-programs`;
const res = yield axios.get(url);
const tPs = res.data.data;
yield put(fetchTrainingProgramsSuccess(tPs));
} catch (err) {
yield put(fetchTrainingProgramsFail(err));
}
}
Run Code Online (Sandbox Code Playgroud)
// 第一次渲染(在服务器端),它是有效的 baseURL 属性,但是如果我从客户端调用相同的 saga(当组件被渲染时)它是未定义的,所以我必须输入完整的 url
为了向浏览器公开变量,您必须在变量前面加上前缀
NEXT_PUBLIC_
。例如:NEXT_PUBLIC_BACKEND_URL='http://localhost:3000'
然后你可以在axios中访问这个env变量作为其客户端渲染
import axios from 'axios';
const instance = axios.create({
baseURL: process.env.NEXT_PUBLIC_BACKEND_URL,
});
Run Code Online (Sandbox Code Playgroud)
*注意:您必须使用 process.env.NEXT_PUBLIC_BACKEND_URL 而不是 process.env.BACKEND_URL
process.env只在服务器端工作。您可以使用publicRuntimeConfig访问客户端和服务器端的环境变量。
下一个.config.js
module.exports = {
publicRuntimeConfig: {
// Will be available on both server and client
backendUrl: process.env.BACKEND_URL,
},
}
Run Code Online (Sandbox Code Playgroud)
axios 实例文件
import axios from 'axios';
import getConfig from 'next/config';
const { publicRuntimeConfig } = getConfig();
const instance = axios.create({
baseURL: publicRuntimeConfig.backendUrl,
});
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果您使用的是Next.js9.4 及更高版本,环境变量提供了另一种方式。
| 归档时间: |
|
| 查看次数: |
6475 次 |
| 最近记录: |