Я развертываю приложение React в веб-приложении Azure. Структура проекта следующая: корень
│
├── server.js
├── package.json
├── package-lock.json
│
└── client
├── build
├── public
├── package.json
├── package-lock.json
└── src
└── index.js
В файле index.js, расположенном в каталоге src моего приложения React, я пытаюсь настроить Auth0 для аутентификации. Вот соответствующий фрагмент кода:
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { Auth0Provider } from '@auth0/auth0-react';
const domain = process.env.REACT_APP_AUTH0_DOMAIN;
const clientId = process.env.REACT_APP_AUTH0_CLIENT_ID;
if (!domain || !clientId) {
console.error('Missing Auth0 configuration');
}
ReactDOM.render(
<React.StrictMode>
<Auth0Provider
domain = {domain}
clientId = {clientId}
authorizationParams = {{
redirect_uri: window.location.origin, // Automatically use the current origin
}}
>
<App />
</Auth0Provider>
</React.StrictMode>,
document.getElementById('root')
);
Я настроил переменные среды REACT_APP_AUTH0_DOMAIN и REACT_APP_AUTH0_CLIENT_ID в настройках своего веб-приложения Azure, но мое приложение React не может прочитать эти переменные во время выполнения. В консоли регистрируется ошибка «Отсутствует конфигурация Auth0», указывающая на то, что переменные среды не найдены.
Конфигурация переменных среды: проверено, что переменные среды правильно настроены на портале Azure в разделе «Конфигурация» Службы приложений.
Сборка и развертывание: гарантировали, что приложение React собирается и развертывается правильно, запустив npm run build и затем развернув содержимое папки сборки.
Я ожидаю, что после правильной настройки переменных среды мое приложение React сможет читать эти переменные во время выполнения и правильно настраивать Auth0.
Интересно, что та же проблема существует и при локальном запуске приложения с заданной файловой структурой. Однако локально это решается добавлением дополнительного файла .env в папку клиента. К сожалению, этот подход нельзя применить в Azure, поскольку переменные среды, настроенные на портале Azure, должны быть автоматически доступны приложению во время выполнения.
EikkaPine Можете ли вы предоставить поток журналов для вашей Службы приложений Azure?
Как вы развертываете свое приложение в Службе приложений Azure через GitHub или расширение VS Code?
@SirraSneha Я развертываю через github с помощью службы сборки службы приложений, и мой поток журналов не предоставляет никакой информации, связанной с проблемой. И, как я уже сказал, я могу решить эту проблему локально, добавив .env в папку клиента, но это не работает в Azure.
Кроме того, server.js, который обрабатывает мои подключения к базе данных, может получать переменные среды Azure, но не index.js в папке клиента! Я делаю здесь что-то не так?
Я создал пример приложения реагирования, которое печатает переменные среды в качестве вывода.
Спасибо @medium.com за четкое объяснение. Я сослался на этот документ и создал приложение React, используя файл .env
.
.env-файл:
REACT_APP_NAME=Sneha
REACT_APP_JOB_TITLE=Engineer
REACT_APP_BRANCH=CSE
приложение.js:
import React from 'react';
function App() {
const name = process.env.REACT_APP_NAME;
const jobTitle = process.env.REACT_APP_JOB_TITLE;
const branch = process.env.REACT_APP_BRANCH;
return (
<div>
<h1>Display Environment Variables</h1>
<p>Name: {name}</p>
<p>Job Title: {jobTitle}</p>
<p> Branch: {branch}</p>
</div>
);
}
export default App;
Я развернул приложение в Службе приложений Azure (Windows) с помощью действий GitHub.
файл рабочего процесса:
name: Build and deploy Node.js app to Azure Web App - Reactenv18
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node.js version
uses: actions/setup-node@v3
with:
node-version: '20.x'
- name: Install dependencies
run: npm install
- name: Build the React app
run: npm run build --if-present
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
with:
name: node-app
path: .
retention-days: 1
max-concurrency: 10
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'Production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
permissions:
id-token: write
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v4
with:
name: node-app
- name: Login to Azure
uses: azure/login@v2
with:
client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_<client-id> }}
tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_<tenant-id> }}
subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_<subscription-id> }}
- name: 'Deploy to Azure Web App'
uses: azure/webapps-deploy@v3
id: deploy-to-webapp
with:
app-name: 'Reactenv18'
slot-name: 'Production'
package: .
site\wwwroot\build
Таким образом, приложение реагирует на использование и загрузку переменных среды как при разработке, так и при производстве.
Вывод после развертывания:
Огромное спасибо за понятное объяснение и пример! Изменение виртуального пути в конфигурации службы приложений Azure решило мою проблему. Я очень ценю вашу помощь!
Я рад, что это сработало!
Приложение React не имеет доступа к какой-либо переменной среды во время выполнения, поскольку это просто статические ресурсы, HTML, CSS, JS и т. д., без какого-либо серверного кода. Все эти конфигурации env применяются только на этапе
build
.