У React возникают проблемы с рендерингом элементов, когда я обслуживаю React из того же источника, что и express

#node.js #reactjs #express

#node.js #reactjs #экспресс

Вопрос:

Я обслуживаю сборку React с того же порта ( port 3000 ), на который мои файлы express получают запросы. Ниже приведен мой код для этого.

 app.use(express.static(path.join(__dirname, "client", "build")))

app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, "client", "build", "index.html"))
})
 

В моем приложении react я выполняю вызов API на сервер, и ответ API обновляет состояние. Я знаю (из тестирования), что получаю правильный ответ от сервера, и я знаю, что состояние правильно обновляется с ответом. Но когда я пытаюсь выполнить рендеринг <p>{this.state.data}</p> , все приложение ломается, и ничего не отображается.

У кого-нибудь есть идеи о том, почему это происходит? Я попытался обслуживать приложение React из его папки на другом порту, и оно по-прежнему не работает. Публикую весь соответствующий код ниже для справки.

Код реакции

 import React from 'react';
import './App.css';

class Form extends React.Component{
  constructor(props){
    super(props);
  }

  onTrigger = (event) => {
    this.props.callBack();
  }

  render(){
    return(
          <div>
              <form action="/photoupload" method="POST" className="" encType="multipart/form-data">
                  <label for="species">Species Name: 
                      <input type="text" name="species" id="species"/>
                  </label>
  
                  <label for="description">Description: 
                      <textarea name="description" id="description" placeholder="Enter a description of your shroom..."></textarea>
                  </label>
  
                  <label for="photo">Photo: 
                      <input type="file" name="mushroom" id="mushroom" accept="image/*"/>
                  </label>
  
                  <input onClick={this.onTrigger} type="submit"/>
  
              </form>
          </div>
    )
  }
}

class App extends React.Component {
  constructor(props){
    super(props);
    this.state = {
      data: ""
    };
  }

  componentDidMount(){
    fetch('/api', {method: "GET"})
    .then(response => response.json())
    .then(json => this.setState({
      data: json
    }))
    console.log(this.state)
  }

  handleClick = () => {
    console.log("Hello!")
  }
 
  render(){
    return (
      <div>
        <Form callBack={this.handleClick} />
        <p>{this.state.data}</p>
      </div>
    )
  }
}

export default App;
 

Серверный код

 const express = require('express')
const app = express();
const bodyParser = require('body-parser')
const multer = require('multer')
const upload = multer({dest: 'uploads/'})
const fs = require('fs')
const Mushroom = require('./db')
const path = require('path')
const cors = require('cors')

app.use(bodyParser.urlencoded({extended: false}));

app.use(express.static(path.join(__dirname, "client", "build")))

app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, "client", "build", "index.html"))
})

app.get('/api', (req, res) => {
    const mushroom = Mushroom.find({}, (err, docs) => {
        res.send(docs)
    });
})

app.post('/photoupload', upload.single('mushroom'), function (req, res) {
    var mushroom = new Mushroom();
    mushroom.species = req.body.species;
    mushroom.description = req.body.description;
    mushroom.path = req.file.path;
    mushroom.save()
    res.redirect("/")
})

app.listen(3000, () => {
    console.log("listening on 3000!")
})
 

Редактировать

Я просто собираюсь скопировать и вставить ошибки ниже:

 App.js:51 Objectdata: "{_id: 132454}"__proto__: Object
:3000/manifest.json:1 Failed to load resource: the server responded with a status of 404 (Not Found)
:3000/manifest.json:1 Manifest: Line: 1, column: 1, Syntax error.
:3000/favicon.ico:1 Failed to load resource: the server responded with a status of 404 (Not Found)
react-dom.production.min.js:216 Error: Minified React error #31; visit https://reactjs.org/docs/error-decoder.html?invariant=31amp;args[]=object with keys {_id, age, species, description, path, __v} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.
    at ka (react-dom.production.min.js:140)
    at d (react-dom.production.min.js:144)
    at m (react-dom.production.min.js:146)
    at react-dom.production.min.js:150
    at Do (react-dom.production.min.js:176)
    at Hu (react-dom.production.min.js:271)
    at Pi (react-dom.production.min.js:250)
    at xi (react-dom.production.min.js:250)
    at _i (react-dom.production.min.js:250)
    at vi (react-dom.production.min.js:243)
uu @ react-dom.production.min.js:216
react-dom.production.min.js:140 Uncaught (in promise) Error: Minified React error #31; visit https://reactjs.org/docs/error-decoder.html?invariant=31amp;args[]=object with keys {_id, age, species, description, path, __v} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.
    at ka (react-dom.production.min.js:140)
    at d (react-dom.production.min.js:144)
    at m (react-dom.production.min.js:146)
    at react-dom.production.min.js:150
    at Do (react-dom.production.min.js:176)
    at Hu (react-dom.production.min.js:271)
    at Pi (react-dom.production.min.js:250)
    at xi (react-dom.production.min.js:250)
    at _i (react-dom.production.min.js:250)
    at vi (react-dom.production.min.js:243)
 

Комментарии:

1. Не могли бы вы добавить к своему вопросу журнал сбоев или журнал консоли?

2. @JuanMedina только что обновил

Ответ №1:

Согласно вашей ошибке, кажется {this.state.data} , что это объект, и у него есть только 1 свойство, id поэтому вы можете изменить его на {this.state.data.id} вместо

Ответ №2:

Если вы перейдете на страницу уменьшенной ошибки из журнала вашей консоли, вы увидите, что ошибка связана с попыткой рендеринга объекта, с которым не будет работать <p> .

Это зависит от того, что вы хотите отобразить данные, чтобы увидеть данные в виде строки, измените свою строку на <p>{JSON.stringify(this.state.data)</p> , и она отобразит объект в виде строки.