Выполнить дочерний процесс Node.js после нажатия кнопки - PullRequest
0 голосов
/ 08 января 2019

На данный момент у меня есть код в Node.js, который вызывает программу «EnergyPlus». К сожалению, мне нужно запустить внешнюю консоль и выполнить файл Node.js «вручную». Тем не менее, я хотел бы иметь возможность нажать кнопку в передней части моего приложения, которая запускает программу «EnergyPlus» плюс.

Вот мой файл Node.js:

var spawn = require('child_process').spawn,
child = spawn('C:\\EnergyPlusV9-0-1\\EP-Launch.exe', ["C:/Windows/System32/Drivers/etc/hosts"]);

child.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
});

child.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
});

child.on('close', function (code) {
    console.log('child process exited with code ' + code);
});

Есть ли способ интегрировать этот код в кнопку или выполнить этот код после нажатия кнопки? Заранее большое спасибо!

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Большое спасибо за помощь! Я нашел решение для моей проблемы. Для начала, в моем приложении я работаю с React и Webpack. Чтобы решить мою проблему, я структурировал свой файл Server.js (где я настраивал поведение Express) следующим образом:

const express = require('express');
const app = express();
const port = process.env.PORT || 5000;
const fs = require("fs")
const spawn = require('child_process').spawn;

// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
app.use(cors())

// create a GET route
app.get('/express_backend/:filename', (body, res) => {
const f = body.params.filename;

// open EnergyPlus Programm with a specific file which is stored localy
let child = spawn(
'C:\\EnergyPlusV9-0-1\\EP-Launch.exe',
 [process.cwd()+"src/"+ f + ".idf"]
 );

child.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});

child.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});

child.on('close', function (code) {
console.log('child process exited with code ' + code);
});

res.send('EnergyPlus is running');
});

// default options
app.use(fileUpload());

//post the uploaded file into the local storage
app.post('/upload', function(req, res) {
  ...
}

// The name of the input field (i.e. "sampleFile") is used to retrieve the uploaded file
let sampleFile = req.files.file;

// Use the mv() method to place the file localy
 fs.writeFile(__dirname + `/upload/${sampleFile.name}`, sampleFile.data,
(err) => {
   ....
  })
});

Как упомянул Нино Филиу в своем посте, я интегрировал функцию порождения детей в server.js. Сначала я вызываю EP launch.ex с конкретным файлом, который я хранил локально (эта функция не является частью этого ответа). «C: \ EnergyPlusV9-0-1 \ EP-Launch.exe» - это путь к EnergyPlus. "[process.cwd () +" src / "+ f +" .idf "]" помогает EnergyPlus открыть директорию локального сохраненного поля. Поэтому важная вещь, касающаяся моей проблемы, - это app.get, который я запускаю в своем App.js. В App.js я вызываю дочерний процесс порождения так:

class App extends Component { 

constructor(props){
super(props)
this.state = {filename: null}
};

componentDidMount() {
  ...
};

callBackendAPI = async () => {
  ...
};

//trigger the spawn child function within server.js
startEnergyPlus = (e) =>{
fetch (`http://localhost:5000/express_backend/${this.state.filename}`, {
method: "GET"
});

render(){
 return( 
  <div className="App">
   <button onClick={this.startEnergyPlus}>start app</button>
  </div>
};

И это все. Надеюсь, это понятно и полезно. Если нет, пожалуйста, оставьте комментарий!

0 голосов
/ 08 января 2019

Вот как вы можете это сделать:

  1. При нажатии кнопки на стороне клиента отправьте запрос на определенный путь в вашем экспресс-API
  2. Ваш экспресс-API обрабатывает запрос, запуская программу

Код что-то похожее на это:

client.html:

<button onclick="func()">start app</button>
<script>
  const func = () => fetch('http://your.api.url/some/path');
</script>

server.js:

// imports
const express = require('express');
const spawn = require('child_process').spawn;

// create server
const app = express();

// upon request to the launch path, launch the program
app.get('/some/path', (req, res) => {

  let child = spawn(
    'C:\\EnergyPlusV9-0-1\\EP-Launch.exe',
    ["C:/Windows/System32/Drivers/etc/hosts"]
  );
  // etc (rest of the code you wrote)

  // response. You can modify this to send a custom response to your client
  res.send('');
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...