繁体   English   中英

使用ASP.NET Core NodeServices的Azure应用服务上的NodeJ不会执行

[英]NodeJs on Azure app service using ASP.NET Core NodeServices does not execute

我在Azure App Service上有一个站点,它使用节点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"
  },

在app服务上执行此操作时,我收到以下错误:

[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 install。 我尝试了不同的节点版本并重新启动了应用程序服务,但仍然得到相同的错误。

我也尝试删除package-lock.json文件并重新发布该网站,但是徒劳无功。

问题似乎是C#运行时无法找到Node JS依赖关系phantom 从Node JS的角度来看,我认为可能没有安装依赖项,因为Kudu可能不会在C#App Service中安装依赖项。 这可以解释为什么它适用于您的计算机,而不适用于云计算。 要解决此问题,请尝试按照以下步骤操作:

  1. 启动Azure门户并导航到您的App Service>选择高级工具> Go。 这应该在浏览器的新选项卡中打开Kudu服务。
  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. 重新启动App Service并测试您的功能

如果您没有package.json文件,则可能无法发布,在这种情况下您会遇到其他问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM