Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 执行页面更改或关闭操作_Javascript_Node.js_Express_Spawn - Fatal编程技术网

Javascript 执行页面更改或关闭操作

Javascript 执行页面更改或关闭操作,javascript,node.js,express,spawn,Javascript,Node.js,Express,Spawn,我有一个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']); ...

我有一个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']);
    ...
}
我想做的是添加某种匿名函数,当页面更改、选项卡关闭甚至刷新时,这些函数将被调用。简言之,我想杀死生成的进程


谷歌在研究这方面对我不好

我要做的是在每个请求中发送一个具有唯一值的cookie,并将该值作为键存储在映射中,该值是子进程对象,以便您可以终止它

然后在Javascript页面上添加一个
unload
处理程序,向一个具有该唯一值的新URL发出请求,以允许您执行终止操作

e、 g.您的express代码类似于:

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的浏览器):


window.onunload=函数(){
var req=new XMLHttpRequest(),
javaSessionId=document.cookie.replace(/(?:(?:^ |。*;\s*)java_session\u id\s*=\s*([^;]*).$)|.*.*$/,“$1”);///regex fromhttps://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#Example_.232.3A_Get_a_sample_cookie_named_test2
请求打开(“GET”、“/unload/”+javaSessionId);
};
您还可以从请求中获取cookie值,而无需在Javascript中显式读取cookie值并将其作为URL参数发送。它可能已随请求一起发送


您需要测试所有这些,这些都是假设性的代码,您必须亲自尝试。

很好,我会尝试这一点——尽管我希望NodeJS具有一些内置功能,可以检测最终用户何时离开页面(因为它应该检测何时不再需要在中游“服务器”页面?)如果您只是响应一个请求,那么一旦发送了响应,express通常不会保留任何内容。这就是他们说HTTP是“无状态”的意思。每一个请求都被视为是它收到的第一个请求。如果要在服务器上维护状态,则需要手动执行所有操作。服务器能够知道客户端是否取消了请求的唯一可能方法是在服务器仍在发送数据时客户端是否中止。但是,当您所做的只是发送一些带有一些标题(在本例中包括cookie)的HTML时,一旦客户端接收到这些标题,服务器就会忘记有关该客户端和该请求的所有信息。为什么您希望该进程在页面视图中运行,而只在页面视图中运行?对我来说,这似乎是一种潜在的方法,也可能是一种保持请求打开的方法,即在连接关闭时接收事件。您的问题是真正知道何时调用java.kill()以及如何保留引用
<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>