Как я могу создать отдельную папку в REACT для моих маршрутов Axios, которые связаны с моим node.js - PullRequest
0 голосов
/ 13 февраля 2019

Здравствуйте, я пытаюсь создать отдельную папку для моих маршрутов axios.Я не хочу, чтобы они были внутри моего файла компонентов в React.

Я пробовал это в следующей папке, отдельно от папки моих компонентов.src> действия> аутентификация

import axios from 'axios';

export const signupUser = (user, history) => dispatch => {
  axios.post('http://localhost:3000/signup', user)
  console.log(user)
    .then(res => history.push('/login'))
    .catch(err => {
      console.log(err);

    });
};

Внутри компонента Registration.js у меня есть следующее, которое в настоящее время не работает

import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { signupUser } from '../actions/authentication';
import axios from 'axios';

let today = new Date();
let date = today.getFullYear()+ '-' +  (today.getMonth()+1)+ '-' +today.getDate();




class Signup extends Component {

  constructor() {
    super()
    this.state = {
      first_name: '',
      last_name: '',
      user_name: '',
      email: '',
      password: '',
      created_on: date,
      isSignedup: false
    }

    this.handleInputChange = this.handleInputChange.bind(this);

    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleInputChange = (e) => {
    this.setState({
      [e.target.name]: e.target.value
    })
    console.log(this.state);
  }

  handleSubmit = (e) => {
    e.preventDefault();

    const user = {

      first_name: this.state.first_name,
      last_name: this.state.last_name,
      email: this.state.email,
      user_name: this.state.user_name,
      password: this.state.password,
      created_on: this.state.created_on,
      isSignedup: !this.state.isSignedup
    }
    .then(data => {
      console.log(data);
      this.props.history.replace('/login');
    })
    .catch(err => {
      console.log(err);
    })
  }

Это работает только в моих компонентах> Registration.js, еслиУ меня есть фактический маршрут оси внутри компонента следующим образом:

handleSubmit = (e) => {
    e.preventDefault();

    axios.post('http://localhost:3000/signup', {

      first_name: this.state.first_name,
      last_name: this.state.last_name,
      email: this.state.email,
      user_name: this.state.user_name,
      password: this.state.password,
      created_on: this.state.created_on,
      isSignedup: !this.state.isSignedup
    })
    .then(data => {
      console.log(data);
      this.props.history.replace('/login');
    })
    .catch(err => {
      console.log(err);
    })
  }

Ошибка, которую я продолжаю получать, заключается в том, что .then не является функцией.Может кто-нибудь помочь мне с этим вопросом?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Вы на правильном пути со своим мышлением, поскольку это делает дизайн вашего приложения более модульным.

Вы можете создать папку с именем apis/, ее не обязательно называтьно я просто даю вам пример.Затем внутри создайте файл с именем myjson.js, снова назовите его так, как считаете нужным.Внутри этой папки у вас будет что-то вроде этого:

import axios from "axios";

export default axios.create({
  baseURL: "https://api.myjson.com"
});

Тогда вы можете реализовать это внутри вашего создателя действий как myJson.post()

Вы также можете сделать что-то вроде этого:

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

const ROOT_URL =
  "https://exampleurl.com";

class SignUpForm extends Component {
  state = { phone: "" };

  handleSubmit = () => {
    axios
      .post(`${ROOT_URL}/createUser`, {
        phone: this.state.phone
      })
      .then(() => {
        axios.post(`${ROOT_URL}/requestOneTimePassword`, {
          phone: this.state.phone
        });
      });
  };

Вышеприведенное, конечно, основано на аутентификации с использованием одноразового пароля, поэтому приспособьте ее к логике вашей архитектуры.

Кроме того, если вы собираетесь использовать функцию constructor с super(props) вам нужно передать props в нее, как я только что сделал.

Вы можете избежать всего этого, используя ES7 и просто назначая

state = {
  first_name: '',
  last_name: '',
  user_name: '',
  email: '',
  password: '',
  created_on: date,
  isSignedup: false
}

Вы уже используете функцию стрелки в вашем handleSubmit, поэтому нет необходимости делать это: this.handleSubmit = this.handleSubmit.bind(this); Функция стрелки заботится о контексте this.

Мы можем пойти дальше и реорганизовать функцию handleSubmit, чтобы она выглядела чище, используя синтаксис ES7 async / await, например:

handleSubmit = async () => {
 await axios.post(`${ROOT_URL}/createUser`, {
   phone: this.state.phone
 });
 await axios.post(`${ROOT_URL}/requestOneTimePassword`, {
   phone: this.state.phone
 });
};

И для обработки ошибок, поскольку мы используем async / await, мы можем обернуть все ожидаемое с помощью блока try / catch следующим образом:

handleSubmit = async () => {
    try {
      await axios.post(`${ROOT_URL}/createUser`, {
        phone: this.state.phone
      });

      await axios.post(`${ROOT_URL}/requestOneTimePassword`, {
        phone: this.state.phone
      });
    } catch (err) {
      console.log(err);
    }
  };

Таким образом, вы можете поймать и сохранить журналошибка.

И try / catch не является новым с ES2015 / 16/17, он существует уже некоторое время.

По сути, всякий раз, когда вы хотите обрабатывать ошибки, выданные запросом, управляемымоператор await, мы можем заключить его в оператор try / catch.

Ответ о неудачном сетевом запросе будет передан как объект ошибки, и мы сможем сохранить его в журнале, чтобы увидеть, что происходит.

0 голосов
/ 14 февраля 2019

Вы получаете ошибку .then is not a function из-за этого кода:

const user = {

  first_name: this.state.first_name,
  last_name: this.state.last_name,
  email: this.state.email,
  user_name: this.state.user_name,
  password: this.state.password,
  created_on: this.state.created_on,
  isSignedup: !this.state.isSignedup
}
.then

Это недопустимый JavaScript.Присвоение объекта переменной не создает обещание.Вы действительно должны позвонить на signupUser.

Кроме того, я не понимаю, почему вы передаете dispatch в свою функцию регистрации, если никогда не вызываете ее?

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