Вызов локально размещенного сервера из приложения Expo

Я создаю приложение для реагирования, и один из компонентов, которые я создал, содержит свойство, которое заполняется данными, поступающими из HTTP-запроса.

Сейчас я размещаю сервер с моего ноутбука, но я тестирую приложение на своем телефоне с помощью приложения Expo. Поскольку это два отдельных устройства, вызовы http://localhost: 3000 не работают, и поэтому я не могу определить, правильно ли работает мой компонент.

Есть ли способ запустить сервер на моем ноутбуке и настроить его так, чтобы HTTP-запросы из приложения Expo дошли до сервера?

Ответ 1

Вы можете получить IP-адрес во время выполнения, используя манифест Экспо:

import Expo from "expo";
const { manifest } = Expo.Constants;
const api = (typeof manifest.packagerOpts === 'object') && manifest.packagerOpts.dev
  ? manifest.debuggerHost.split(':').shift().concat(':3000')
  : 'api.example.com';

Это установит api константу по адресу вашей локальной машины для разработки в режиме разработки и по любому адресу, который вы используете в производственной среде. Обратите внимание, что приложения, развернутые через App Store/Play Store, по-видимому, имеют packagerOpts undefined. Вот почему у нас есть дополнительное typeof состояние. В таком случае мы предполагаем, что это сборка производства.

Подробнее о манифесте здесь: https://docs.expo.io/versions/latest/guides/how-expo-works.html#expo-manifest

Ответ 2

Чтобы добавить к ответу Tadeusz, в текущей версии Expo (сейчас я нахожусь на 32.0.0), вы должны импортировать Constants а не Expo (даже если константы упоминаются в документах как Expo.Constants.manifest), поэтому это будет выглядеть

import { Constants } from 'expo';
const { manifest } = Constants;

Кроме того, добавление сгенерированного адреса к протоколу является обязательным условием, чтобы все это работало.

Ответ 3

import Constants from "expo-constants";

const { manifest } = Constants;

const uri = 'http://${manifest.debuggerHost.split(':').shift()}:4000';

Ответ 4

Вы должны заменить http://localhost:3000/ address на ip-адрес вашего компьютера.

В Windows откройте приглашение и введите ipconfig, проверьте строку вашего сетевого интерфейса и получите адрес IPV4, должен выглядеть как 192.168.1.20. Затем вы можете сделать свои звонки с помощью fetch и URL-адресом, похожим на htt://192.168.1.20/routname.

Кстати, ваш компьютер (сервер) и ваше устройство должны находиться в одной локальной сети. Wi-Fi и LAN имеют одну и ту же сеть.

Ответ 5

На всю жизнь я не мог заставить работать какое-либо решение, которое я нашел (в том числе все на этой странице). Я провел пару дней, пытаясь. Наконец, я просто сдался и обошел эту проблему, используя localtunnel и выставив мой сервис, работающий на localhost:8080 в Интернете. Сработала первая попытка при звонке из моего выставочного приложения. Возможно, не самое лучшее долгосрочное решение, но не так уж и плохо. Я надеюсь, что это помогает кому-то еще!

Ответ 6

Еще один простой способ. Сначала вам нужно на Mobile HotSpot и подключиться к ноутбуку с помощью Mobile HotSpot. Затем проверьте, назначен ли вам ip-адрес на ваш компьютер, и замените api url http://localhost: 80/ address на http://192.168.5.43:80/ в исходном исходном тексте, где вы используете.

Замените порт 80 на порт сервера api no.

Убедитесь, что у вас есть открытый порт сервера (80) в брандмауэре в ноутбуке.

Проверить api в android rest-client https://play.google.com/store/apps/details?id=com.sn.restandroid app (url: http://192.168.5.43:80/api)