TimeoutException: процесс Angular CLI не начал слушать запросы в течение периода ожидания 0 секунд - PullRequest
8 голосов
/ 12 февраля 2020

Я получаю эту ошибку после обновления до angular 9. Я использую Visual Studio 2019, ASP. NET ядро ​​с angular. Даже если я создаю новый проект и обновляю angular до версии 9, он перестает работать.

Полный список ответов на странице:

TimeoutException: процесс Angular CLI сделал не начинать прослушивание запросов в течение времени ожидания 0 секунд. Проверьте вывод журнала на наличие информации об ошибке. Microsoft.AspNetCore.SpaServices.Extensions.Util.TaskTimeoutExtensions.WithTimeout (задача-задача, TimeSpan timeoutDelay, строковое сообщение) proxy404s) Microsoft.AspNetCore.Builder.SpaProxyingExtensions + <> c__DisplayClass2_0 + d.MoveNext () Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)

Мой пакет. json:

{
  "name": "webapplication10",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "build:ssr": "ng run WebApplication10:server:dev",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "9.0.0",
    "@angular/cdk": "~9.0.0",
    "@angular/common": "9.0.0",
    "@angular/compiler": "9.0.0",
    "@angular/core": "9.0.0",
    "@angular/forms": "9.0.0",
    "@angular/material": "~9.0.0",
    "@angular/platform-browser": "9.0.0",
    "@angular/platform-browser-dynamic": "9.0.0",
    "@angular/platform-server": "9.0.0",
    "@angular/router": "9.0.0",
    "@nguniversal/module-map-ngfactory-loader": "8.1.1",
    "aspnet-prerendering": "^3.0.1",
    "bootstrap": "^4.4.1",
    "core-js": "^3.6.4",
    "jquery": "3.4.1",
    "oidc-client": "^1.10.1",
    "popper.js": "^1.16.1",
    "rxjs": "^6.5.4",
    "tslib": "^1.10.0",
    "zone.js": "~0.10.2"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "^0.900.1",
    "@angular/cli": "9.0.1",
    "@angular/compiler-cli": "9.0.0",
    "@angular/language-service": "9.0.0",
    "@types/jasmine": "^3.5.3",
    "@types/jasminewd2": "~2.0.8",
    "@types/node": "^12.12.27",
    "codelyzer": "^5.2.1",
    "jasmine-core": "~3.5.0",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "^4.4.1",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "^2.1.1",
    "karma-jasmine": "~3.1.1",
    "karma-jasmine-html-reporter": "^1.5.2",
    "typescript": "3.7.5"
  },
  "optionalDependencies": {
    "node-sass": "^4.12.0",
    "protractor": "~5.4.2",
    "ts-node": "~8.4.1",
    "tslint": "~5.20.0"
  }
}
```

Ответы [ 6 ]

10 голосов
/ 15 февраля 2020

TL; DR

К сожалению, проблема, похоже, связана с некоторыми изменениями в способе Angular CLI при запуске части angular приложения. В соответствии с этой проблемой:

https://github.com/dotnet/aspnetcore/issues/17277

Предлагаемые решения должны установить прогресс: true в angular. json или выполнить простое эхо до ng подача (https://github.com/dotnet/aspnetcore/issues/17277#issuecomment -562433864 ).

Полный ответ

Я выкопал asp. net базовый код базы (https://github.com/dotnet/aspnetcore), посмотрим, как шаблон Angular запускает приложение Angular.

Основной механизм, запускающий сервер angular, представлен двумя классами: AngularCliMiddleware (https://git.io/JvlaL ) и NodeScriptRunner (https://git.io/Jvlaq).

В AngularCliMiddleware мы находим этот код (я удалил исходные комментарии и добавил некоторые свои собственные, чтобы объяснить несколько вещей):

    public static void Attach(ISpaBuilder spaBuilder, string npmScriptName)
    {
        var sourcePath = spaBuilder.Options.SourcePath;
        if (string.IsNullOrEmpty(sourcePath))
        {
            throw new ArgumentException("Cannot be null or empty", nameof(sourcePath));
        }

        if (string.IsNullOrEmpty(npmScriptName))
        {
            throw new ArgumentException("Cannot be null or empty", nameof(npmScriptName));
        }

        // Start Angular CLI and attach to middleware pipeline
        var appBuilder = spaBuilder.ApplicationBuilder;
        var logger = LoggerFinder.GetOrCreateLogger(appBuilder, LogCategoryName);
        var angularCliServerInfoTask = StartAngularCliServerAsync(sourcePath, npmScriptName, logger);

        var targetUriTask = angularCliServerInfoTask.ContinueWith(
            task => new UriBuilder("http", "localhost", task.Result.Port).Uri);

        SpaProxyingExtensions.UseProxyToSpaDevelopmentServer(spaBuilder, () =>
        {
            var timeout = spaBuilder.Options.StartupTimeout;
            return targetUriTask.WithTimeout(timeout,
                $"The Angular CLI process did not start listening for requests " +

                // === NOTE THIS LINE, THAT CARRIES THE "0 seconds" BUG!!!
                $"within the timeout period of {timeout.Seconds} seconds. " + 

                $"Check the log output for error information.");
        });
    }

    private static async Task<AngularCliServerInfo> StartAngularCliServerAsync(
        string sourcePath, string npmScriptName, ILogger logger)
    {
        var portNumber = TcpPortFinder.FindAvailablePort();
        logger.LogInformation($"Starting @angular/cli on port {portNumber}...");

        var npmScriptRunner = new NpmScriptRunner(
            sourcePath, npmScriptName, $"--port {portNumber}", null);
        npmScriptRunner.AttachToLogger(logger);

        Match openBrowserLine;
        using (var stdErrReader = new EventedStreamStringReader(npmScriptRunner.StdErr))
        {
            try
            {
                // THIS LINE: awaits for the angular server to output
                // the 'open your browser...' string to stdout stream
                openBrowserLine = await npmScriptRunner.StdOut.WaitForMatch(
                    new Regex("open your browser on (http\\S+)", RegexOptions.None, RegexMatchTimeout));
            }
            catch (EndOfStreamException ex)
            {
                throw new InvalidOperationException(
                    $"The NPM script '{npmScriptName}' exited without indicating that the " +
                    $"Angular CLI was listening for requests. The error output was: " +
                    $"{stdErrReader.ReadAsString()}", ex);
            }
        }

        var uri = new Uri(openBrowserLine.Groups[1].Value);
        var serverInfo = new AngularCliServerInfo { Port = uri.Port };

        await WaitForAngularCliServerToAcceptRequests(uri);

        return serverInfo;
    }

Как видите, метод StartAngularCliServerAsyn c создает новый объект NpmScriptRunner , который является оболочкой для вызова метода Process.Start, в основном, присоединяет регистратор и затем ожидает, когда StdOut процесса испустит что-то, что соответствует «откройте ваши брови» на httpSOMETHING ... ".

Забавно, что это должно работать !

Если вы запускаете ng serve (или npm run start) в папке ClientApp, как только сервер запускается, он все еще выдает вывод «откройте ваш браузер на http ...».

Если вы запускаете приложение tnet, сервер узла фактически запускается, просто включите все журналы в режиме отладки. найдите строку «Starting @ angular / cli on port ...» и попробуйте посетить localhost на этом порту, и вы увидите, что ваше angular приложение работает.

Проблема в том, что по какой-то причине StdOut больше не получает строку «открыть ваш браузер» и не записывается регистратором ... кажется, что каким-то образом эта конкретная строка вывода из ng serve задерживается, как будто она больше не отправляется в выводе Stardard поток. Метод WaitForMatch достигает своего тайм-аута через 5 секунд и отлавливается из кода метода расширения WithTimeout, который выводит (ошибочное) сообщение «... 0 секунд ...».

Что я мог видеть После запуска tnet приложения запускается последовательность процессов, но я не заметил разницы в командной строке от Angular 8 до Angular 9.

My Теория заключается в том, что в CLI Angular что-то было изменено, что препятствует отправке этой строки в stdout, поэтому прокси. net не перехватывает его и не может определить, когда запущен сервер angular.

Согласно этой проблеме:

https://github.com/dotnet/aspnetcore/issues/17277

Предлагаемые решения должны установить прогресс: true в angular. json или выполнить простое эхо до подачи нг (https://github.com/dotnet/aspnetcore/issues/17277#issuecomment -562433864 ).

6 голосов
/ 14 февраля 2020

для устранения ошибки строгого режима удалите эту строку из main.ts

export { renderModule, renderModuleFactory } from '@angular/platform-server';

Однако это не решает проблему тайм-аута. Я также получаю эту ошибку после обновления до Angular 9 и использования. NET core.

Запуск приложения angular с помощью «ng serve», а затем изменение сценария запуска spa для использования UseProxyToSpaDevelopmentServer работает как Обходной путь

2 голосов
/ 26 февраля 2020

Вот что я сделал

от Fairl ie Agile, закомментировал эту строку в main.ts

export { renderModule, renderModuleFactory } from '@angular/platform-server';

От Клаудио Валерио В angular. json, установите

"progress": true,

Теперь я могу запустить приложение, нажав F5 / Запуск IIS Express

1 голос
/ 12 февраля 2020

Как предложено в https://developercommunity.visualstudio.com/solutions/446713/view.html, вы должны установить параметр конфигурации StartupTimeout.

В основном в Startup.cs:

 app.UseSpa(spa =>
    {
      spa.Options.SourcePath = "./";
      //Configure the timeout to 5 minutes to avoid "The Angular CLI process did not start listening for requests within the timeout period of 50 seconds." issue
      spa.Options.StartupTimeout = new TimeSpan(0, 5, 0);
      if (env.IsDevelopment())
      {
        spa.UseAngularCliServer(npmScript: "start");
      }
    });
0 голосов
/ 01 мая 2020

В пакете. json изменить ng подачи на ng serve --host 0.0.0.0 enter image description here

0 голосов
/ 27 апреля 2020

Вот обходной путь:

  • В пакете. json измените сценарий запуска с "ng serve" на "ngserve"
"scripts": {
  "start": "ngserve",
  • В том же каталоге создайте файл ngserve.cmd со следующим содержимым:
@echo ** Angular Live Development Server is listening on localhost:%~2, open your browser on http://localhost:%~2/ **
ng serve %1 %~2

Теперь Do tnet получает строку, которую он ждет. После этого команда ng serve запустит сервер (так что на самом деле Angular Live Development Server еще не прослушивает), откроется браузер, и сначала он не будет работать (ng serve все еще компилируется), но если вы нажмете перезагрузите через некоторое время, все должно быть в порядке.

Это просто обходной путь, но он работает для нас.

...