【问题标题】:Node.js alternative to PHP's execNode.js 替代 PHP 的 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 也可以)。尤其是输入/输出重定向?

【问题讨论】:

标签: javascript php html node.js express


【解决方案1】:

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

  1. node.js 的 PHP exec 等效项
  2. 执行 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(可执行文件),只是在我的问题中有一个错字。这似乎是一个可靠的答案。接受!
猜你喜欢
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2011-02-22
  • 2022-08-23
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多