2016-02-24 10 views
1

Я хочу написать часть программного обеспечения C (например, факторизация простого номера) и разместить его на своем веб-сервере (на основе Node.js). Тогда я хотел бы иметь HTML -документ с формой и кнопкой.Node.js альтернатива exec PHP

Когда кнопка нажата, необходимо выполнить (на сервере) C -программу с текстовым полем формы, переданной в качестве входного параметра. Выход в программе C должен быть снова передан в поле HTML -text.

В PHP что-то вроде этого можно:

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

Как бы идти о чем-то вроде этого в Node.js (Express.js отлично, а). В частности, перенаправление ввода/вывода?

+0

use [shelljs] (https://www.npmjs.com/package/shelljs) – Xorifelse

ответ

2

Я чувствую, что ваш вопрос 2 части.

Exec эквивалентно
  1. PHP для Node.js
  2. исполняющих программу C и обеспечивают его из положить с помощью Node.js.

Придерживаясь чистого узла.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}); 
    }); 
}); 

Вы можете играть с выше фрагменты кода и получить то, что вы ищете.

Надеюсь, это поможет. Пожалуйста, дайте мне знать, если вам нужно что-нибудь еще.

+0

Почему бы просто не скомпилировать программу C в файле ввода .js приложения. Таким образом, вы могли бы предотвратить загрузку приложения, если компиляция сделала ошибку? Вы даже можете кэшировать мета-программу, используя 'app.set ('c-program-verson', 'here')' для последующей проверки. В любом случае, вероятно, не рекомендуется собирать программу во время жизненного цикла приложения. Это наиболее определенно должно быть сделано в процессе развертывания (или процесса сборки, если вы переводите JS). Вы можете использовать «npm postinstall» или «npm prestart» при использовании сценариев npm. – Seth

+1

@Seth Я согласен с тобой, о чем он пытается выполнить программу c напрямую, поэтому я просто упомянул, что вы не сможете напрямую выполнять программу c, вам нужно ее скомпилировать. Поэтому в моем ответе я только что показал способ компиляции из node.js, вы можете реализовать его в задаче gulp/grunt, так как код сборки компилируется в папку и он непосредственно выполняется в запросе.Мои фрагменты «просто для того, чтобы представить идею», что нужно будет сделать, чтобы получить желаемый результат. –

+0

Спасибо, много. Я на самом деле имел в виду уже скомпилированную 'C'программу (исполняемый файл) и просто имел опечатку в моем вопросе. Это похоже на солидный ответ. Принято! – LastSecondsToLive

Смежные вопросы