在 localhost 反应原生 android 连接后端服务

Posted

技术标签:

【中文标题】在 localhost 反应原生 android 连接后端服务【英文标题】:React native android connect backend service at localhost 【发布时间】:2018-03-10 07:22:35 【问题描述】:

我有一个由 Nodejs 处理的注册服务。该服务在 3001 端口上运行。我尝试从 React Native 应用程序连接此服务。但总是返回

ReactNativeJS: [TypeError: 网络请求失败]

我的组件和 package.json 代码如下。另外,我将 URL localhost 替换为 127.0.0.1 并且它不起作用。当我从 Postman 测试后端服务时,它工作正常。给出非常常见的异常网络错误,因此很难理解问题的根源。每个 React Native 开发初学者都可以轻松面对这个问题。那么问题是由 React Native 还是 android 引起的?

import React,  Component  from 'react';
import 
    TextInput,
    ScrollView,
    Alert,
    TouchableHighlight,
    Text,
    StyleSheet
 from 'react-native';

export default class Register extends Component 
    constructor(props) 
        super(props);
        this.onPress = this.onPress.bind(this);
    

componentDidMount() 
    this.state = 
        email: '',
        password: '',
        passwordRepetition: '',
        error: '',
        loading: false
    ;


onPress() 
    fetch('http://127.0.0.1:3001/user/register', 
        method: 'POST',
        headers: 
            Accept: 'application/json',
            'Content-Type': 'application/json',
        ,
        body: JSON.stringify(
            email: this.state.email,
            password: this.state.password,
        ),
    ).then(res => 
        console.log(res);
    )
        .catch(err => 
            console.log(err);
        );


render() 
    return (
        <ScrollView>
            <TextInput
                style= height: 40 
                placeholder="type@email.com"
                onChangeText=email => this.setState( email )
            />
            <TextInput
                style= height: 40 
                placeholder="veryhardpassword"
                secureTextEntry
                onChangeText=password => this.setState( password )
            />
            <TextInput
                style= height: 40 
                placeholder="repetition of password"
                secureTextEntry
                onChangeText=passwordRepetition =>
                    this.setState( passwordRepetition )
                
            />
            <TouchableHighlight style=styles.button onPress=this.onPress>
                <Text> Touch Here </Text>
            </TouchableHighlight>
        </ScrollView>
    );



const styles = StyleSheet.create(
    container: 
        flex: 1,
        justifyContent: 'center',
        paddingHorizontal: 10
    ,
    button: 
        alignItems: 'center',
        backgroundColor: '#DDDDDD',
        padding: 10
    ,
    countContainer: 
        alignItems: 'center',
        padding: 10
    ,
    countText: 
        color: '#FF00FF'
    
);

包.json


  "name": "mobile",
  "version": "0.0.1",
  "private": true,
  "scripts": 
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "test": "jest"
  ,
  "dependencies": 
    "react": "16.3.0-alpha.1",
    "react-native": "^0.54.0"
  ,
  "devDependencies": 
    "babel-jest": "22.4.1",
    "babel-preset-react-native": "4.0.0",
    "eslint": "^4.18.2",
    "eslint-plugin-react": "^7.7.0",
    "jest": "22.4.2",
    "react-test-renderer": "16.3.0-alpha.1"
  ,
  "jest": 
    "preset": "react-native"
  

【问题讨论】:

你使用的是模拟器还是设备 我都试过了 如果您可以在浏览器中查看它,请检查您的电脑是否可以访问,然后尝试使用您的应用程序连接到它 【参考方案1】:

可能有 2 个案例来测试这个问题。

    使用设备 使用模拟器

关键点在命令下方运行

$adb 反向 tcp:3001 tcp:3001

模板:adb reverse tcp:APPLICATIONPORT tcp:APPLICATIONPORT

第一种情况是 ipconfig inside pc 并找到本地 IP 地址,如 192.168.1.4。你的网址应该像http://192.168.1.4:3001/user/register

如果你使用模拟器,你应该使用以下网址,如http://10.0.2.2:3001/user/register

在运行 adb reverse 命令后,这些 URL 对我有用。

【讨论】:

【参考方案2】:
ifconfig | grep "192.168"

第一个是你应该指向的那个

【讨论】:

以上是关于在 localhost 反应原生 android 连接后端服务的主要内容,如果未能解决你的问题,请参考以下文章

反应原生图像组件在android中不起作用

如何使用 Android Studio 调试原生反应原生库?

反应原生 - SQLite - Android

反应原生 textDecoration 属性在 Android 上不起作用

在 Android 上反应原生 Linking.getInitialUrl 总是调用

如何在反应原生android中获取设备ID?