Как я могу получить данные из моего экспресс-приложения в мой компонент во внешнем интерфейсе (который находится в React)? - PullRequest
0 голосов
/ 22 сентября 2019

Я работаю над приложением MySQL / React / Express / Node для хакатона.У меня есть маршрут, по которому мой партнер делает запрос POST, и я могу получить поля JSON.Тем не менее, я хочу отправить эти поля в мой компонент приложения внешнего интерфейса.Кроме того, я не знаю, когда будет сделан запрос POST, и я хочу отправить эти данные внешнему интерфейсу, как только он будет отправлен на мой сервер, чтобы я мог динамически обновлять внешний интерфейс.Как я могу отправить данные JSOMN на мой веб-интерфейс и как я могу продолжать проверять, были ли данные опубликованы?Вот мой код для приложения Express, за которым следует мой компонент App:

Я попытался импортировать файл Express в свой компонент React, но это невозможно.

Экспресс:

var epoch = null;
var accuracy = null;

app.get('/', (_req, res) => {
  res.send({"epoch": epoch, "accuracy": accuracy});
})

app.post('/', (req, res) => {
  epoch = req.body.epoch;
  accuracy = req.body.accuracy;

  console.log("Epoch: "+epoch);
     console.log("Accuracy: "+accuracy);
  res.send("");
   })

React Frontend App Component:

import React, { Component } from 'react';
import { BrowserRouter as Router, Route,Switch, Redirect} from 'react-router-dom'
import logo from './logo.svg';
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import Hello from './Hello.js';
import { Button, Row, Col, Container, Input, Label } from 'reactstrap';


import {
  Collapse,
  Navbar,
  NavbarToggler,
  NavbarBrand,
  Nav,
  NavItem,
  NavLink,
  UncontrolledDropdown,
  DropdownToggle,
  DropdownMenu,
  DropdownItem } from 'reactstrap';

class App extends Component {

constructor(props){
        super(props);

        this.state = {
                query1: '',
                query2: '',
                error: '',
                epoch: null,
                validation_accuracy: null,
                isOpen: false,
                email: '',
                accuracy: ''

        }
        this.updateInput1 = this.updateInput1.bind(this);
        this.updateInput2 = this.updateInput2.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
        this.toggle = this.toggle.bind(this);
        this.ticker = this.ticker.bind(this);
        this.checkEpoch = this.checkEpoch.bind(this);
}

updateInput1(event){
        this.setState({query1: event.target.value});
        console.log(event.target.value);
}

updateInput2(event){
        this.setState({query2: event.target.value});
        console.log(event.target.value);
}

checkEpoch(e){
        // while(this.state.epoch == null && this.state.epoch < 100){
                fetch('http://localhost:4000/', {
                  method: 'GET',
                  headers: {
                    'Content-type': 'application/json',
                  },
                })
                  .then(res => this.setState({epoch : res.json().epoch, accuracy: res.json().accuracy}))
                  .then(res => console.log(this.state.epoch))
                  .then(res => console.log(this.state.accuracy))
                  .catch((e) => console.log(e));
        }
        // this.setState({epoch: null});

route_path = () => {
          this.props.history.push('/');
}

handleSubmit(e) {
    const data = { q1: this.state.query1, q2: this.state.query2 };
    fetch('/*remote server*/', {
      method: 'POST',
      headers: {
        'Content-type': 'application/json',
      },
      body: JSON.stringify(data),
    })
      .then(res => res.json())
      .then(res => console.log(res));
  }


render() {
        return (
        <div className="App">
        <Container>
        <Row>
          <Col><Input placeholder="Class one name." onLoad={this.ticker} className="mt-5" onChange= {this.updateInput1}/></Col>
          <Col><Input placeholder= "Class two name." onLoad={this.ticker} className="mt-5" onChange={this.updateInput2}/></Col>
        </Row>
        <Row>
        <Col></Col>
        <Col><Button className="mt-5" color='danger' size="lg" onClick={this.handleSubmit, this.checkEpoch}>Go</Button></Col>
        <Col></Col>
        </Row>
      </Container>
                <Route path="/hello" component={Hello}/>
                </div>
        );
}
}```

1 Ответ

0 голосов
/ 22 сентября 2019

То, что вы пытаетесь достичь, может быть сделано через веб-сокеты.

Когда вы делаете HTTP-вызов (скажем, пост или получить), клиент отправляет запрос, получает ответ, и соединение закрывается.

В то время как в веб-сокетах они обеспечивают постоянное соединение между клиентом и сервером, которое обе стороны могут использовать для начала отправки данных в любое время, именно то, что вам нужно.

Я рекомендую использовать сокет.io в вашем приложении для начала работы.

Статьи для начала работы с веб-сокетами:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...