Невозможно развернуть приложение React JS в службе приложений Azure

Aug 19 2020

Я просматривал некоторые ссылки для развертывания приложения React Js в службе приложений Azure. Но у меня возникла проблема при развертывании приложения.

Я добавил все необходимые вещи, такие как web.configфайл в publicпапку, а также добавил каталог сборки в рабочую область.

Развертывание веб-приложения в службе приложений Azure

Развертывание Node.js в службе приложений Azure с помощью кода Visual Studio

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

npm run build.

2020-08-19T10:44:45.762075166Z A P P   S E R V I C E   O N   L I N U X
2020-08-19T10:44:45.762079567Z 
2020-08-19T10:44:45.762083667Z Documentation: http://aka.ms/webapp-linux
2020-08-19T10:44:45.762088167Z NodeJS quickstart: https://aka.ms/node-qs
2020-08-19T10:44:45.762092268Z NodeJS Version : v12.16.3
2020-08-19T10:44:45.762096468Z Note: Any data outside '/home' is not persisted
2020-08-19T10:44:45.762100768Z 
2020-08-19T10:44:45.789282727Z Found build manifest file at '/home/site/wwwroot/oryx-manifest.toml'. Deserializing it...
2020-08-19T10:44:45.792738514Z Build Operation ID: |OtQwveNuO0A=.83a2ec6c_
2020-08-19T10:44:47.255197638Z Writing output script to '/opt/startup/startup.sh'
2020-08-19T10:44:47.960307930Z Running #!/bin/sh
2020-08-19T10:44:47.960336532Z 
2020-08-19T10:44:47.960345833Z # Enter the source directory to make sure the script runs where the user expects
2020-08-19T10:44:47.960355334Z cd "/home/site/wwwroot"
2020-08-19T10:44:47.960363235Z 
2020-08-19T10:44:47.960370735Z export NODE_PATH=$(npm root --quiet -g):$NODE_PATH
2020-08-19T10:44:47.960378436Z if [ -z "$PORT" ]; then 2020-08-19T10:44:47.960386136Z export PORT=8080 2020-08-19T10:44:47.960393937Z fi 2020-08-19T10:44:47.960401238Z 2020-08-19T10:44:47.960408638Z echo Found tar.gz based node_modules. 2020-08-19T10:44:47.960416339Z extractionCommand="tar -xzf node_modules.tar.gz -C /node_modules" 2020-08-19T10:44:47.960424040Z echo "Removing existing modules directory from root..." 2020-08-19T10:44:47.960431740Z rm -fr /node_modules 2020-08-19T10:44:47.960439141Z mkdir -p /node_modules 2020-08-19T10:44:47.960446542Z echo Extracting modules... 2020-08-19T10:44:47.960453842Z $extractionCommand
2020-08-19T10:44:47.960461243Z export NODE_PATH="/node_modules":$NODE_PATH 2020-08-19T10:44:47.960468943Z export PATH=/node_modules/.bin:$PATH
2020-08-19T10:44:47.960476344Z if [ -d node_modules ]; then
2020-08-19T10:44:47.960483745Z     mv -f node_modules _del_node_modules || true
2020-08-19T10:44:47.960491245Z fi
2020-08-19T10:44:47.960498446Z 
2020-08-19T10:44:47.960505546Z if [ -d /node_modules ]; then
2020-08-19T10:44:47.960524748Z     ln -sfn /node_modules ./node_modules 
2020-08-19T10:44:47.960532849Z fi
2020-08-19T10:44:47.960540149Z 
2020-08-19T10:44:47.960547550Z echo "Done."
2020-08-19T10:44:47.960554951Z npm start
2020-08-19T10:44:48.258132115Z Found tar.gz based node_modules.
2020-08-19T10:44:48.258154316Z Removing existing modules directory from root...
2020-08-19T10:44:48.260461807Z Extracting modules...
2020-08-19T10:44:48.262765098Z tar (child): node_modules.tar.gz: Cannot open: No such file or directory
2020-08-19T10:44:48.262778299Z tar (child): Error is not recoverable: exiting now
2020-08-19T10:44:48.262970515Z tar: Child returned status 2
2020-08-19T10:44:48.262983816Z tar: Error is not recoverable: exiting now
2020-08-19T10:44:48.290740216Z Done.
2020-08-19T10:44:48.512406278Z npm info it worked if it ends with ok
2020-08-19T10:44:48.512836614Z npm info using [email protected]
2020-08-19T10:44:48.512976126Z npm info using [email protected]
2020-08-19T10:44:48.578204629Z npm info lifecycle [email protected]~prestart: [email protected]
2020-08-19T10:44:48.584464048Z npm info lifecycle [email protected]~start: [email protected]
2020-08-19T10:44:48.589867495Z 
2020-08-19T10:44:48.589881796Z > [email protected] start /home/site/wwwroot
2020-08-19T10:44:48.589887297Z > react-scripts start
2020-08-19T10:44:48.589891697Z 
2020-08-19T10:44:48.597331914Z sh: 1: react-scripts: not found
2020-08-19T10:44:48.598224588Z npm info lifecycle [email protected]~start: Failed to exec start script
2020-08-19T10:44:48.599091959Z npm ERR! code ELIFECYCLE
2020-08-19T10:44:48.599182267Z npm ERR! syscall spawn
2020-08-19T10:44:48.599258573Z npm ERR! file sh
2020-08-19T10:44:48.599314678Z npm ERR! errno ENOENT
2020-08-19T10:44:48.600738196Z npm ERR! [email protected] start: `react-scripts start`
2020-08-19T10:44:48.600749897Z npm ERR! spawn ENOENT
2020-08-19T10:44:48.600754497Z npm ERR! 
2020-08-19T10:44:48.600758798Z npm ERR! Failed at the [email protected] start script.
2020-08-19T10:44:48.600763398Z npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2020-08-19T10:44:48.605436585Z npm timing npm Completed in 125ms
2020-08-19T10:44:48.605621800Z 
2020-08-19T10:44:48.605672405Z npm ERR! A complete log of this run can be found in:
2020-08-19T10:44:48.605750311Z npm ERR!     /root/.npm/_logs/2020-08-19T10_44_48_601Z-debug.log

Но дело в одно и то же приложение работает отлично на локальный с ниже команд npm install, npm start.

и просто чтобы проверить, npm run buildпыталась ли сборка, созданная после работы, запустить приложение из каталога сборки с помощью следующих команд

npm install -g serve

тогда

serve -s build

затем приложение откроется в браузере.

Ответы

2 rav Aug 19 2020 at 21:58

Из журнала похоже, что это не Node.jsприложение, а reactприложение. Таким образом, react-scripts startслужба приложений Azure ничего не знает.

Когда вы запускаете reactприложение на локальном хосте, оно питается от сервера, development serverкоторый на самом деле является Node.jsсервером, но как только вы создадите его для производства, используя npm run buildего, это будет не что иное, как index.htmlфайл, управляемый кучей .jsфайлов и таблиц стилей. Сам по себе он не имеет веб-возможностей.

serveс другой стороны это отдельная история. Согласно их описанию на npmjs.comстранице: Предполагая, что вы хотите обслуживать статический сайт, одностраничное приложение или просто статический файл (независимо от того, находится ли он на вашем устройстве или в локальной сети), этот пакет - правильный выбор для вас.

Но это не подход, похожий на Azure.

Однако в производственной среде, если вы используете Azure, я рекомендую использовать хранилище BLOB-объектов Azure версии 2, в котором есть возможности размещения статических сайтов. Включите размещение статического сайта в хранилище BLOB-объектов и разверните buildпапку в контейнере с именем $web. Конечно все это происходит автоматически , если вы используете vscodeс Azure plugin. Предполагая, что вы вошли в Azure через vscode, щелкните правой кнопкой мыши buildпапку и выберите deploy to static site, следуйте инструкциям, и вы будете жить со своим приложением реакции.

Однако, если у вас есть Node.js expressсерверная часть вместе с reactприложением, вы можете поместить buildпапку в Node.jsпроект на том же уровне, что и node_modulesпапка, и использовать статическую маршрутизацию, чтобы и интерфейс, и серверная часть работали как один пакет. Явно определите маршрут, по которому expressнужно ответить index.htmlфайлом, когда он будет запрошен. Затем вы можете развернуть весь пакет в Azure App Service.

const express = require('express');
const path = require('path');
const port = process.env.PORT || 3006;

const app = express();

app.use(express.json())
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json({extended: true}));

app.use(express.static(__dirname + '/build'));
app.get('/', (req, res) => { 
  res.sendFile(path.join(__dirname + '/build/index.html'))
});

// Then prefix your API endpoints with /api
app.get('/api/user/:id', (req, res) => {
  // Code to get user by id
});

app.post('/api/user', (req, res) => {
  // Code to save user
});

app.listen(port, () => {
  console.log(`App bootstrapped on port ${port}...`);
});

Когда /попадает, то index.htmlподается. Вызовы API обслуживаются, как определено в /api/*. Я много раз нахожу этот механизм полезным.

Удачи.

2 PrateekNaik Aug 20 2020 at 15:33

После некоторого поиска в Google нашел решение . Нам нужно добавить приведенную ниже команду в команду запуска в конфигурации службы приложений для компьютеров Linux.

pm2 serve /home/site/wwwroot --no-daemon

Шаги:

- Go to App Service

- Navigate to Configuration

- Click on General Settings

- add the above command in Start up command, click on save 

- then restart the server