Node.js 替代 PHP 的 exec

Posted

技术标签:

【中文标题】Node.js 替代 PHP 的 exec【英文标题】:Node.js alternative to PHP's exec 【发布时间】:2016-06-07 11:26:26 【问题描述】:

我想写一个C 软件(比如素数分解)并将它放在我的网络服务器上(基于Node.js)。 然后我想要一个带有表单和按钮的html-document。

当点击按钮时,C-程序应该被执行(在服务器上),表单的文本字段作为输入参数传递。这 C-program 的输出应再次传递给 HTML-textfield。

php 中,这样的事情是可能的:

<?php
exec('~/tools/myprog.o');
?>

我将如何在Node.js 中处理这样的事情(Express.js 也可以)。尤其是输入/输出重定向?

【问题讨论】:

使用shelljs 【参考方案1】:

我觉得你的问题是两部分。

    node.js 的 PHP exec 等效项 执行 C 程序并使用 node.js 提供其输出。

坚持使用纯node.js,您将能够使用以下代码执行并访问stdout和stderr。

var exec = require('child_process').exec;

exec("ls -l", function(error, stdout, stderr) 
  console.log(error || stdout || stderr);
);

对于#2, 我不确定你是否可以直接执行“c”程序,所以我想你需要做这样的事情

 var exec = require('child_process').exec;

exec("gcc ~/tools/myprog.c -o prime && ./prime", function(error, stdout, stderr) 
  console.log(error || stdout || stderr);
);

上面的代码绝对不是线程安全的,如果并发请求,它会中断,理想情况下你不会为每个请求编译它,你会为第一个请求编译和缓存(你可以匹配源的时间戳和编译的输出,如果编译的输出不存在或它的时间戳更小 - 比源代码更早,那么你需要编译它),然后在后续请求中使用缓存的输出。

在快递中,您可以执行以下操作

var exec = require('child_process').exec;
router.get('/prime/:num',function(req, res, next)
   exec("gcc ~/tools/myprog.c -o prime && ./prime " + req.params.num, function(error, stdout, stderr) 
      if(error)
         res.status(400).json('message': error.message);
         return;
      
      if(stderr)
         res.status(400).json('message': stderr);
         return;
      

      res.status(200).json('result': stdout);
   );
);

你可以使用上面的代码 sn-ps 并得到你想要的。

希望这会有所帮助。如果您还需要什么,请告诉我。

【讨论】:

为什么不直接编译应用程序的.js入口文件中的C程序。这样,如果编译抛出错误,您可以阻止应用程序启动?您甚至可以使用app.set('c-program-verson', 'here') 缓存程序元数据以供以后验证。无论如何,在应用程序生命周期中编译程序可能不是一个好主意。这绝对应该在您的部署(或构建过程,如果您正在转译 JS)过程中完成。如果使用 npm 脚本,您可以利用 npm postinstallnpm prestart @Seth 我同意你的观点,问题是他试图直接执行 ac 程序,所以我刚才提到你将无法直接执行 c 程序,你需要编译它.所以在我的回复中,我刚刚展示了一种如何从 node.js 中编译的方法,您可以在 gulp / grunt 任务中实现它,以便构建代码被编译到一个文件夹中并直接在请求中执行。我的 sn-ps 是“只是为了提供一个想法”为了获得所需的输出需要做什么。 非常感谢。我实际上的意思是一个已经编译的Cprogram(可执行文件),只是在我的问题中有一个错字。这似乎是一个可靠的答案。接受!

以上是关于Node.js 替代 PHP 的 exec的主要内容,如果未能解决你的问题,请参考以下文章

Node.JS 寻找 socket.IO 的替代方案

Node.js:setInterval 的替代品,更适合游戏循环

Node.js 主机名/IP 与证书的替代名称不匹配

node.js 中 MongoDB cursor.toArray() 的替代方案

按顺序发出请求 Node.js

在 Node JS 中管道远程文件寻找替代方法