У меня есть сайт в службе приложений 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
и переиздать сайт, но тщетно.