React Native 响应本地/博览会:获取抛出“网络请求失败”

3okqufwl  于 2023-03-09  发布在  React
关注(0)|答案(8)|浏览(167)

我看了几篇关于这个主题的帖子,但没有结果。我一方面有一个表格,收集信息(姓名,名字等),然后将其保存在数据库(mongodb)中。当我使用 Postman 通过路由/注册发送我的信息时,一切正常,我可以在mongodb中看到我的新用户。但当我在世博会上启动应用程序时,他向我抛出"网络请求失败"。
前端提取:

submitForm = () => {
  var signupData = JSON.stringify({
    first_name: this.state.firstName,
    last_name: this.state.lastName,
    email: this.state.email,
    password: this.state.password
  });

  fetch(`https://localhost:3000/signup`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: signupData
  })
    .then(response => {
      console.log(response);
      return response.json();
    })
    .then(data => {
      if (data.result) {
        this.props.handleUserValid(
          this.state.firstName,
          this.state.lastName,
          this.state.email,
          data.user.token
        );
        this.props.navigation.navigate("Account");
      }
    })
    .catch(error => {
      console.error(error);
    });
};

和后端路由:

router.post("/signup", function(req, res, next) {
  var salt = uid2(32);

  console.log("Signup is running...");
  const newUser = new userModel({
    first_name: req.body.first_name,
    last_name: req.body.last_name,
    email: req.body.email,
    password: SHA256(req.body.password + salt).toString(encBase64),
    token: uid2(32),
    salt: salt
  });
  newUser.save(function(error, user) {
    console.log("LOG: user", user);
    res.json({ result: true, user });
  });
});

module.exports = router;

这是错误的屏幕截图

再次使用Postman时,获取工作良好,我的控制台日志被打印,用户添加到我的数据库中。谢谢帮助。

  • --编辑--*

我通过Expo在网络浏览器中启动了这个应用程序,一切都很完美。我的登录/注册页面和我的帐户页面。但在我的手机上它不工作(IOS),这是我手机的网络问题(可能是证书问题,错误的IP?)
如果你有我感兴趣的主意,我已经想了两天了

xmjla07d

xmjla07d1#

React-native Expo和Python Django后端也有同样的问题。问题是模拟器localhost和服务器localhost之间的冲突。你的后端服务器可能运行在127.0.0.1:8000上,但模拟器找不到它。
在终端中,使用命令“ipconfig”找到您的Ipv4地址。例如,它将是192.138.1.40
在此之后,将其放入您的获取(“http://192.138.1.40:8000/”)。
同样重要的是-使用相同的主机和端口运行后端服务器。
例如,在python Django上:
运行manage.py服务器192.138.1.40:8000
在Django上你还需要在www.example.com中添加ALLOWED_HOSTS =['192.138.1.40']settings.py

j8yoct9x

j8yoct9x2#

使用expo时,请使用设备(计算机)的IP地址(http://192.168.x.x:3000/ "signup"),而不是"localhost"。此方法对我有效。请确保您的PC和手机连接到同一网络。在命令提示符下键入ipconfig/all以查找IP地址。
更新:
看起来这是我的问题,加上我的室友霸占了wifi带宽。缓慢的互联网连接可能也是一个问题。atb与您的问题。

kgqe7b3p

kgqe7b3p3#

我对世博会也有同样的问题:对于我的后端,我使用json-server来模拟API数据。在我的例子中,json-server运行在http://localhost:3000/playlist上
我没有使用fetch(“http://localhost:3000/playlist”),而是使用fetch(http://10.0.2.2:3000/playlist),然后它工作了。使用Android模拟器,它找不到服务器的地址。
有关使用www.example.com的原因10.0.2.2,请查看此处。why do we use 10.0.2.2 to connect to local web server instead of using computer ip address in android client

mrfwxfqh

mrfwxfqh4#

我也有同样的问题--对我有效的方法是:
1.在主机www.example.com上运行本地服务器0.0.0.0
1.转到网络偏好设置并找到我的局域网IP地址(例如192.168.1.1)
1.将移动的应用程序中我的url中的主机替换为LAN IP(例如http://192.168.1.1:3000/signup
1.重新加载和测试
对于使用无服务器的任何人,我使用此命令在www.example.com上运行0.0.0.0

ENV=local serverless offline -s local -o 0.0.0.0
ecbunoof

ecbunoof5#

我遇到了类似的问题。显然,模拟器不理解或看到'localhost'作为主机。我做了什么:在你的cmd上运行ipconfig,复制ipv4地址,然后使用它来替换你的服务器主机的'localhost'。

cedebl8k

cedebl8k6#

确保检查仿真器上的日期和时间,以便从react native发出远程请求
日期和时间设置不准确还可能导致SSL证书出现问题,SSL证书用于验证正在与之通信的服务器的身份。如果模拟器上的时钟与服务器的时钟不同步,则SSL证书可能显示为无效,从而阻止发送请求。

yh2wf1be

yh2wf1be7#

您应该检查URL

  • https://localhost:3000/signup(X)
  • http://localhost:3000/signup(O)

非HTTPS

55ooxyrt

55ooxyrt8#

如果任何人面临这个问题与托管后端服务器这是为您的知识。

但我仍然面临着以下问题。

Network request failed at node_modules\whatwg-fetch\dist\fetch.umd.js:535:17 in setTimeout$argument_0
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:130:14 in _callTimer
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:383:16 in callTimers
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:416:4 in __callFunction
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:109:6 in __guard$argument_0
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:364:10 in __guard
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:108:4 in callFunctionReturnFlushedQueue

经过一番研究,我发现这是因为服务器的响应时间太慢。网络请求由于超时而失败。
所以在用后端服务器测试你的应用之前,从网络(或任何其他方式)向你的服务器发送一些请求。因为一些服务器在一段时间后会变得不活动。请确保你有一个良好的连接。

相关问题