Вызов локально размещенного сервера из приложения 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)