首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用process从Web API应用程序运行全局节点应用程序

使用process从Web API应用程序运行全局节点应用程序
EN

Stack Overflow用户
提问于 2019-08-29 06:27:12
回答 1查看 220关注 0票数 0

我有一个WEB应用程序,它是在NodeJSFramework4.7中完成的,我想在ASP.NET中使用命令行调用应用程序,因此,使用System.Diagnostic.Process。

NodeJs应用程序是使用

代码语言:javascript
复制
npm install -g mapshaper

在开发环境中,一切工作正常,我甚至可以捕获输出,但当我在生产服务器上运行时,我在标准输出中得到以下消息:

代码语言:javascript
复制
'mapshaper' is not recognized as an internal or external command,\r\noperable program or batch file.

(mapshaper是我想运行的nodejs应用程序)

请注意,如果我在生产服务器上直接从命令行运行应用程序,它将完美工作。

如果我从API运行,而不是'mapshaper',命令'DIR‘我会得到目录列表,因此它可以工作。我还尝试运行'node -v‘,并且我正确地获得了已安装的节点版本:

代码语言:javascript
复制
c:\\windows\\system32\\inetsrv>node -v\r\nv10.16.3

下面是我用来调用cmd.exe并插入要运行的命令的代码:

代码语言:javascript
复制
string strOutput = "";
string path = HostingEnvironment.MapPath("~");
string fileName = "cmd.exe ";
string args = "mapshaper -h";
//args = "dir";     //IT WORKS
//args = "node -v"; //IT WORKS and I get the ver. installed as output
System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
pProcess.StartInfo.FileName = fileName;
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.RedirectStandardError = true;
pProcess.StartInfo.RedirectStandardInput = true;

ConcurrentQueue<string> messages = new ConcurrentQueue<string>();

pProcess.ErrorDataReceived += (object se, DataReceivedEventArgs ar) =>
{
    string data = ar.Data;
    if (!string.IsNullOrWhiteSpace(data))
        messages.Enqueue(data);
};
pProcess.OutputDataReceived += (object se, DataReceivedEventArgs ar) =>
{
    string data = ar.Data;
    if (!string.IsNullOrWhiteSpace(data))
        messages.Enqueue(data);
};

pProcess.Start();

pProcess.StandardInput.WriteLine(args);
pProcess.StandardInput.Flush();
pProcess.StandardInput.Close();

pProcess.BeginErrorReadLine();
pProcess.BeginOutputReadLine();
while (!pProcess.HasExited)
{
    string data = null;
    if (messages.TryDequeue(out data))
        strOutput+=data+"\r\n";
}

pProcess.WaitForExit(2000);

pProcess.Close();

因此,在生产环境中,只有命令mapshaper在从上面的代码运行时无法识别(如果它是从命令行手动运行的,它就会起作用)。

可能的原因是什么?是否有在服务器上执行NodeJs的权限?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-29 07:09:47

请确保您已经在生产服务器上运行了命令npm install -g mapshapernpm install不会在开发服务器上安装全局包。

还要确保与/npm包目录链接的路径,请在命令行中运行此脚本

代码语言:javascript
复制
path=%PATH%;%APPDATA%\npm
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57700774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档