#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??