Компонент React не может получить данные из API

Это мой userinfo.js, который извлекает данные из app.js, которые должны отображаться здесь.

import React, { Component } from 'react';
import axios from 'axios';

class UserInfo extends Component {
    constructor() {
        super();
        this.state = {
          error: null,
          isLoaded: false,
          persons: []
        };
    }
    componentDidMount() {
    fetch("http://localhost:5000/api/userinfo")
      .then(res => res.json())
      .then(
        (result) => {
          this.setState({
            isLoaded: true,
            persons: result
          });
        }) 
       .catch(
        (error) => {
          this.setState({
            isLoaded: true,
            error: error
          });
        });
    }

    render(){
        const { error, isLoaded, persons } = this.state;
        if (error) {
          return <div>Error: {error}</div>;
        } else if (!isLoaded) {
          return <div>Loading...</div>;
        } else {
            return(
              <div>
                <h1>profile</h1>
                <h1>{ this.state.persons.map(person => <li key = {this.state.persons.id}>{person.firstName}</li>)}</h1>
              </div>
            );

        } 
    }
}
export default UserInfo;

И API (app.js на сервере узла):

app.get('/oauth/linkedin', function(req, res) {
    // This will ask for permisssions etc and redirect to callback url.
    Linkedin.auth.authorize(res, scope);
});

app.get('/profile/signin-linkedin',function(req,res){
	 Linkedin.auth.getAccessToken(res, req.query.code, req.query.state, function(err, results) {
        if ( err )
            return console.error(err);
        console.info(results);
        request({url:'https://api.linkedin.com/v1/people/~?format=json&oauth2_access_token='+results.access_token},function(error,response, body){
	        if (!error && response.statusCode == 200) {
				console.info('hurray');
				//console.info(response);
				console.info('body is :'+body);
				info = JSON.parse(body);
				info1[0] = info;
				console.info(info1);
				console.info(info.firstName);
				fN = info.firstName;
				lN = info.lastName;
				id = info.id;
				res.redirect('http://localhost:3000/userinfo');
			}
			else{
				console.info(body);
			}
        })
    });
});

app.get('/api/userinfo',function(req,res){
	console.info('hii');
	res.setHeader('Content-Type', 'application/json');
	res.send(info1);
	
});


app.listen(5000,process.env.IP);

Я получаю следующую ошибку: Объекты недопустимы как дочерние объекты React (обнаружено: TypeError: не удалось получить). Если вы хотели отобразить коллекцию дочерних элементов, используйте вместо этого массив. Несмотря на то, что я передаю массив из app.js, я получаю сообщение об ошибке. Может кто-нибудь подскажет, как это решить ??

Можете ли вы проверить, какое значение имеет persons после вызова API. Это некоторая информация1 в соответствии с вашим кодом, которая, я думаю, не является массивом.

Anshul Bansal 25.07.2018 20:41

Мне не очень понятно, что вы здесь пытаетесь сделать, но я заметил одну вещь: судя по опубликованному вами коду, info1, похоже, нигде не объявлен.

hcs 25.07.2018 20:41

Я опубликовал только сегмент кода, связанный с ошибкой, но я объявил info1 в моем исходном коде как var info1 = []

TeslaLDead 25.07.2018 20:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
541
1

Ответы 1

Проблема в том, что вы сохраняете объект ошибки для состояния и визуализируете его как дочерний элемент реакции (объекты недопустимы как дочерние элементы). Происходит то, что ваш .catch((error) => ... возвращается как объект ошибки, а не как строка. Итак, когда вы используете setState, вы устанавливаете свой this.state.error на объект ошибки. Итак, в вашем рендере вы делаете if (error) { return <div>Error: {error}</div>; }, но ошибка, на которую вы ссылаетесь, является объектом, а не строкой, которая является недопустимым дочерним элементом реакции. В заключение, вы должны вместо этого сохранить сообщение об ошибке в состоянии.

.catch(
  (error) => {
    this.setState({
    isLoaded: true,
    error: error.message // error.message is a string
  });
});

Что касается ошибки при загрузке. Используйте Postman или что-то подобное, чтобы отладить, почему вы получаете ошибку с вашего сервера в первую очередь.

Другие вопросы по теме