Как бы мне изменить handleSubmit для развертывания в React?

#reactjs #firebase #heroku

#reactjs #firebase #heroku

Вопрос:

Я развертываю свой портфель в Firebase. У меня есть страница контактов, и она будет отправлять информацию на серверную часть, которую я планирую развернуть в Heroku.

Я не уверен, на что бы я изменил localhost в handleSubmit. Как бы я изменил это, если бы я развертывал?

     handleSubmit = (e) => {
        e.preventDefault();
        if (this.validate()) {
            console.log(e.target);
            this.setState({
                disabled: true,
                emailSent: null
            });
            Axios.post('http://localhost:4000/api/email', this.state)
                .then(res => {
                    if(res.data.success) {
                        this.setState({
                            emailSent: true
                        });
                        this.clearForm();
                    } else {
                        this.setState({
                            disabled: false,
                            emailSent: false
                        });
                    }
                })
                .catch(err => {
                    console.log(err);
                    this.setState({
                        disabled: false,
                        emailSent: false
                    });
                })
        }
    }
  

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

1. вы слышали о переменных среды?

2. Я немного знаком с ними?

Ответ №1:

Существует несколько решений, основанных на вашем случае. Вы не предоставили достаточно подробностей, чтобы я мог дать вам окончательный ответ. Но вот что вы можете попробовать:

Если ваше приложение развернуто в том же домене, вы можете использовать относительный путь, как в:

 Axios.post('/api/email', this.state)
  

Если ваше приложение развернуто не в том же домене, вам нужно ввести эту переменную в код. Лучший способ сделать это — использовать процесс узла process.argv . Все, что связано с процессом, будет прочитано и обработано webpack (я предполагаю, что это то, что вы используете). Затем вы должны ввести URL-адрес API во время конвейера сборки прямо перед развертыванием. Ваша сборка будет выглядеть следующим образом:

 npm run build --api-url=http://yourdomain/url/to/apis
  

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

 // Get the arguments from the process
let args = process.argv.slice(2); // first 2 are node specific

// Try to find the api-url you passed
let argsApiUrl = args.filter(arg => arg.startsWith('--api-url'))[0];

// Use it if it exist, otherwise, use the localhost
let apiUrl = argsApiUrl
                 ? argsApiUrl.split('=')[1]
                 : 'http://localhost:4000/api/email';

  

А затем используйте URL-адрес в вашем вызове

 Axios.post(apiUrl, this.state)
  

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

1. Возможно ли развертывание в том же домене, если серверная часть находится в Heroku, а интерфейс — в Firebase?

2. Firebase и Heroku — это службы хостинга, им в любом случае нужен домен, верно? У вас может быть несколько приложений, развернутых отдельно, пока все они указывают на один домен. У нас была подобная настройка раньше, когда интерфейс был бы в корне / , а внутренние API указывают на /api/

3. Итак, как бы я это сделал, если мой корневой домен, mydomain.com , это моя статическая страница, в то время как мой серверный api.mydomain.com ?

4. Если я не ошибаюсь, поддомены считаются разными доменами. Вам придется полагаться на ввод URL-адреса api во время конвейера сборки, о котором я упоминал в ответе выше.

5. Я не понимаю, почему я не могу просто ввести URL api??