目前,我在Node.js中有一个代码称为“ EnergyPlus”程序。不幸的是,我必须启动一个外部控制台并“手动”执行Node.js文件。但是,我希望能够在应用程序的前端按下一个按钮,以启动“ EnergyPlus” plus程序。
这是我的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);
});
是否可以将此代码集成到按钮内或单击按钮后执行此代码? 提前非常感谢您!
答案 0 :(得分:0)
这是您可以执行的操作:
编写如下所示的代码:
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('');
})
答案 1 :(得分:0)
非常感谢您的帮助! 我找到了解决我问题的方法。 从头开始,在我的应用程序中,我使用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) => {
....
})
});
就像Nino Filiu在他的文章中提到的那样,我将子派生函数集成到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>
};
就是这样。希望它是清楚和有用的。如果没有,请发表评论!