6
respostas

Erro TypeError: this.state.fotos.map is not a function e GET https://instalura-api.herokuapp.com/api/fotos?X-AUTH-TOKEN= 500

Estou usando o react-router-dom e o history

Rotas do index.js

const history = createBrowserHistory();

ReactDOM.render((
    <Router history={history}>
        <Switch>
            <Route exact path="/" component={Login}/>
            <Route path="/timeline" component={App}/>
        </Switch>
    </Router>
), document.getElementById('root'));

serviceWorker.unregister();

Metodo envia do Login.js

envia(event) {
        event.preventDefault();

        const requestInfo = {
            method:'post',
            body:JSON.stringify({login:this.login.value, senha:this.senha.value}),
            header: new Headers({
                'Content-type':'application/json',
            })
        };

        fetch('https://instalura-api.herokuapp.com/api/login', requestInfo)
            .then(response => {
                if(response.ok){
                    return response.text();
                } else {
                    throw new Error('Não foi possível fazer o login')
                }
            })
            .then(token => {
                localStorage.setItem('auth-token', token);
                this.props.history.push('timeline');
            })
            .catch(error => this.setState({msg:error.message}))

    }

Timeline.js

constructor() {
        super();
        this.state = {fotos: []};
    }

    componentDidMount() {
        fetch(`https://instalura-api.herokuapp.com/api/fotos?X-AUTH-TOKEN=${localStorage.getItem('auth-token')}`)
            .then(response => response.json())
            .then(fotos => {
                this.setState({fotos:fotos});
            });
    }

    render() {
        return (

            <div className="fotos container">
                {this.state.fotos.map(foto => <Foto foto={foto}/>)}
            </div>

        );
    }
6 respostas

Fala aí David, tudo bem? Faz o console.log das fotos e veja o que está sendo impresso, parece não ser um Array:

componentDidMount() {
    fetch(`https://instalura-api.herokuapp.com/api/fotos?X-AUTH-TOKEN=${localStorage.getItem('auth-token')}`)
        .then(response => response.json())
        .then(fotos => {
            console.log(fotos);
            this.setState({fotos:fotos});
        });
    }

Espero ter ajudado

É retornado isso:

{timestamp: 1546042125242, status: 500, error: "Internal Server Error", exception: "java.lang.IllegalArgumentException", message: "JWT String argument cannot be null or empty.", …}
error: "Internal Server Error"
exception: "java.lang.IllegalArgumentException"
message: "JWT String argument cannot be null or empty."
path: "/api/fotos"
status: 500
timestamp: 1546042125242
__proto__: Object

esqueci de comentar no inicio da pergunta, estou usando o createBrowserHistory para direcionar a pagina sem um Link, pode ser esse o problema?

Fala aí David, pelo log que você mandou, parece que o token está indo com o valor de null ou vazio.

Faz o seguinte, abra o console do navegador e navegue até a aba Network (se estiver inglês), dai você recarrega a tela.

Você irá ver que sua request deve ter dado problema e ficado em vermelho.

Clica sobre ela e veja como está as informações da URL que foi chamada (provavelmente o X-AUTH-TOKEN estará null ou vazio.

Fico no aguardo.

Isso mesmo Matheus, ele aparece vazio, só não sei como resolver isso.

Consegue me mandar o projeto? Eu te ajuda a dar uma olhada no que pode ser.

Sobe ele no Github, Google Drive ou qualquer outro host.

Abraços