NodeJ в службе приложений Azure с использованием ASP.NET Core NodeServices не выполняется - PullRequest
0 голосов
/ 15 мая 2019

У меня есть сайт в службе приложений Azure, который использует узел js для печати PDF-файлов.

Сайт построен на ядре asp.net и использует NodeServices для вызова библиотеки phantomjs, которая будет использоваться для преобразования html-страницы в pdf.

Я использую следующий код:

public void ConfigureServices(IServiceCollection services)
{
     services.AddNodeServices();
}

И используйте приведенный ниже код для вызова файла nodejs:

var result = await _nodeServices.InvokeAsync<bool>("./NodeJs/createPdf.js", pageUrl);

Мое проектное решение также содержит файл package.json и имеет необходимые зависимости. Решение отлично работает на моей локальной машине.

В Azure я установил максимальную доступную версию nodejs в Конфигурация :

  {
    "name": "WEBSITE_NODE_DEFAULT_VERSION",
    "value": "10.15.2"
  },

При выполнении этого в сервисах приложения я получаю следующую ошибку:

[2019-05-14 12:15:12 ERR] Connection id "0HLMOCN6RLHIU", Request id "0HLMOCN6RLHIU:00000001": An unhandled exception was thrown by the application.
Microsoft.AspNetCore.NodeServices.HostingModels.NodeInvocationException: Cannot find module 'phantom'
Error: Cannot find module 'phantom'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object.<anonymous> (D:\home\site\wwwroot\NodeJs\createPdf.js:1:79)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
   at Microsoft.AspNetCore.NodeServices.HostingModels.HttpNodeInstance.InvokeExportAsync[T](NodeInvocationInfo invocationInfo, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.NodeServices.HostingModels.OutOfProcessNodeInstance.InvokeExportAsync[T](CancellationToken cancellationToken, String moduleName, String exportNameOrNull, Object[] args)
   at Microsoft.AspNetCore.NodeServices.NodeServicesImpl.InvokeExportWithPossibleRetryAsync[T](String moduleName, String exportedFunctionName, Object[] args, Boolean allowRetry, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.NodeServices.NodeServicesImpl.InvokeExportWithPossibleRetryAsync[T](String moduleName, String exportedFunctionName, Object[] args, Boolean allowRetry, CancellationToken cancellationToken)
   at PdfProcessor.Controllers.ProcessToPdfController.Generate(PdfRequestModel model) in d:\a\1\s\PdfProcessor\Controllers\ProcessToPdfController.cs:line 82
   at PdfProcessor.Controllers.ProcessToPdfController.GeneratePdf(String pageUrl) in d:\a\1\s\PdfProcessor\Controllers\ProcessToPdfController.cs:line 52
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

Ошибка выглядит так, как будто установка npm не была запущена в службах приложения. Я пытался использовать разные версии узлов и перезапустить службу приложений, но все равно получаю ту же ошибку.

Я также пытался удалить файл package-lock.json и переиздать сайт, но тщетно.

1 Ответ

0 голосов
/ 15 мая 2019

Проблема заключается в том, что среда выполнения C # не может найти зависимость Node JS phantom.С точки зрения Node JS, я думаю, что зависимость, вероятно, не установлена, потому что Kudu, вероятно, не устанавливает зависимости в службе приложений C #.Это объясняет, почему он работает на вашей машине, а не в облаке.Чтобы устранить ее, попробуйте выполнить следующие действия:

  1. Запустите портал Azure и перейдите к службе приложений> Выберите «Дополнительные инструменты»> «Перейти».Это должно открыть Kudu Services в новой вкладке вашего браузера.
  2. Выберите Debug Console> PowerShell в верхней строке меню
  3. Перейдите к site/wwwroot/.Вы должны увидеть файл package.json и папку с именем node_modules.В этой папке хранятся ваши зависимости Node JS (например: phantom).Если папка node_modules не найдена, она будет создана со следующим шагом.
  4. В командной строке PowerShell запустите npm install.
  5. Теперь вы должны увидеть node_modulesпапка, если она не была ранее.Внутри вы должны найти много папок.Тем не менее, вы должны увидеть phantom в этой папке.Это будет успех.
  6. Перезапустите службу приложений и проверьте свою функцию

Если у вас нет файла package.json, возможно, он не будет опубликован, и в этом случаеу вас другая проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...