安装程序:我目前正在与两个Mac用户组成的小组中进行编码(我正在运行Linux)。我们正在使用React Native制作一个移动应用程序。他们正在iPhone模拟器上测试该应用程序,而该模拟器不适用于Linux。我通过将程序包提供给实际的Android手机来测试该应用。在我尝试向本地服务器发出axios请求之前,此方法工作正常。 根据axios请求,我们输入端点“ http://localhost:3001/whatever”。由于我的程序副本正在移动设备上运行,因此localhost是指该设备而不是计算机。我可以通过将“ localhost”更改为我的IP地址来使请求正常工作。
例如,
//Instead of
axios.get('http://localhost:3001/api/point')
.then(response => doaThing(response));
//I could do
axios.get('http://my.ip.addr:3001/api/point')
.then(response => doaThing(response));
问题:Axios对我的团队来说效果很好。如果不进行更改,它将对我不起作用。我不想在每次提交之前对代码库进行一堆微小的改动。如果第一个请求找不到服务器,是否可以告诉axios尝试我的IP地址?目前,axios会针对此错误返回“ request.status = 0”的对象。
如果这是一个愚蠢的主意,请告诉我:我试图通过为axios创建一个粗糙的包装来解决此问题,该包装可以进行呼叫,检查错误消息以及是否具有状态的0,再打一次。任何回应都应返回。
export default axiOS = {
get: async (endpoint = '', body = {}) => {
await axios.get(`http://localhost:3001${endpoint}`)
.then(response => response)
.catch(async err => {
//if axios cannot find the server, the status code will be 0
if (err.request.status === 0) {
await axios.get(`http://my.ip.addr:3001${endpoint}`)
.then(response => response)
.catch(err => console.log("GET Error: ", err))
} else {
console.log("GET Error: ", err);
}
});
}, //etc. for put, post, and delete
}
被
呼叫let response = axiOS.get('/api/time');
这可以使每个人的生活变得更轻松,但我似乎无法在返回不确定的值之前解决承诺。
tl; dr 所以我的问题至少有两个可能的解决方案
答案 0 :(得分:0)
如果应将应用程序分发给公众,则该应用程序应以某种方式知道与哪个服务器联系。现在,在开发中,它是localhost
或本地ip,以后很可能是一个域。也就是说:在每种情况下,您都需要找到一种方法来配置要使用的URL。我建议使用.env
文件,并以某种方式使url难以进入源代码,以便您的源代码仅使用配置中的url。这样一来,在您的生产应用程序中便可以轻松地拥有最终网址。