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 postinstall
或 npm prestart
。
@Seth 我同意你的观点,问题是他试图直接执行 ac 程序,所以我刚才提到你将无法直接执行 c 程序,你需要编译它.所以在我的回复中,我刚刚展示了一种如何从 node.js 中编译的方法,您可以在 gulp / grunt 任务中实现它,以便构建代码被编译到一个文件夹中并直接在请求中执行。我的 sn-ps 是“只是为了提供一个想法”为了获得所需的输出需要做什么。
非常感谢。我实际上的意思是一个已经编译的C
program(可执行文件),只是在我的问题中有一个错字。这似乎是一个可靠的答案。接受!以上是关于Node.js 替代 PHP 的 exec的主要内容,如果未能解决你的问题,请参考以下文章
Node.js:setInterval 的替代品,更适合游戏循环