我有一个NodeJS / Express(4.10.2)函数,它通过spawn调用外部子进程:
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
var spawn = require('child_process').spawn;
var java = spawn("java", ['-cp', 'lib\\*;bin', 'com.my.app.App']);
...
}
我想要做的是添加某种匿名函数,当页面被更改,选项卡关闭或甚至刷新时,它将被调用。简而言之,我想杀死衍生过程!
谷歌对我的研究并不好。
答案 0 :(得分:1)
我要做的是在每个请求中发送一个具有唯一值的cookie,并将该值作为键存储在地图中,其值为子进程对象,以便您可以将其杀死。
然后在Javascript页面上添加unload
处理程序,以使用该唯一值触发对新URL的请求,以便您执行查杀。
e.g。你的快递代码就像:
var javaSessions = {
_counter: -1
};
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
var spawn = require('child_process').spawn;
var javaSessionId = javaSessions._counter++;
res.cookie('java_session_id', javaSessionId);
var java = spawn("java", ['-cp', 'lib\\*;bin', 'com.my.app.App']);
javaSessions[javaSessionId] = java;
...
});
app.get('/unload/:id', function (req, res) {
var java = javaSessions[req.params.id];
javaSessions[req.params.id] = null;
java.kill();
});
然后在index.html
中,在底部添加以下标记(假设您不需要定位早于Internet Explorer 8的浏览器):
<script type="text/javascript">
window.onunload = function () {
var req = new XMLHttpRequest(),
javaSessionId = document.cookie.replace(/(?:(?:^|.*;\s*)java_session_id\s*\=\s*([^;]*).*$)|^.*$/, "$1"); // regex from https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#Example_.232.3A_Get_a_sample_cookie_named_test2
req.open("GET", "/unload/" + javaSessionId);
};
</script>
您也可以从请求中获取cookie值,而不是需要在Javascript中显式读取它并将其作为URL参数发送。它可能已经与请求一起发送。
您将需要测试所有这些,这是您必须自己尝试的所有非常假设的代码。