Articles of 保持活动

如何在客户端浏览器退出时终止node.js服务器连接?

我试图写一个简单的node.js服务器与服务器发送事件能力没有socket.io。 我的代码运行得不错,但是当我testing它时遇到了一个很大的问题。 如果我从浏览器连接到node.js服务器,它将会收到服务器事件的罚款。 但是当我刷新连接时,相同的浏览器将开始接收事件两次。 如果我刷新n次,浏览器将接收数据n + 1次。 我试过的最多的是16次(16次刷新),之后我就不再去计算了。 从我的浏览器看到下面的控制台截图。 刷新后(试图进行AJAX调用),会输出“SSE长连接build立! 之后它将开始接收事件。 注意事件到达的时间。 我在19:34:07得到了两次事件(它在事件接收和数据写入屏幕上两次logging到控制台,所以你可以在那里看到四个日志)。 我也在19:34:12两次得到事件。 在客户端closures连接(使用source.close())之后,在服务器端看起来如此: 正如你所看到的,它仍然试图发送消息给客户端! 此外,它试图发送消息两次(所以我知道这是一个服务器端问题)! 我知道它试图发送两次,因为它发送了两个心跳,当它只发送一次每30秒。 此问题在打开n个选项卡时会放大。 每个打开的标签将会收到n * n个事件。 基本上,我如何解读它是这样的: 打开第一个标签,我订阅服务器一次。 打开第二个标签,我再次订阅两个打开的标签到服务器 – 所以这是每个标签的2个订阅。 打开第三个选项卡,我再次订阅所有三个打开的​​选项卡,因此每个选项卡共有3个订阅,共有9个,依此类推。 我无法validation这一点,但我的猜测是,如果我可以创build一个订阅,我应该能够取消订阅,如果满足某些条件(即心跳失败,我必须断开连接)。 而这种情况发生的原因只是因为以下原因: 我开始setInterval一次,它的一个实例将永远运行,除非我停止它,或 服务器仍然试图发送数据到客户端试图保持连接打开? 至于1.,我已经试图用clearInterval杀死setInterval,它不起作用。 至于2,虽然可能不可能,但我倾向于相信… 以下是相关部分的服务器端代码片段(根据答案的build议编辑代码): server = http.createServer(function(req, res){ heartbeatPulse(res); }).listen(8888, '127.0.0.1', 511); server.on("request", function(req, res){ console.log("Request Received!"); var route_origin = url.parse(req.url); if(route_origin.query !== null){ […]

请求中止请求时停止/中止请求

我正在使用NodeJS的Restify模块。 也许这是KeepAlive的问题,但是当用户取消对我的API的请求时,我想放弃或停止我的REST服务的所有内部进程。 例如,当在Postman中,你正在做一个消耗30秒的请求,但是你希望在第二个10秒后取消它…我想在服务器上停止这个过程。 任何想法? 我如何实现它? 谢谢。

在Node.js中发送多个HTTP请求:没有收到任何响应或超时

我正在处理维基百科文章,并希望收到所有维基百科文章的列表。 为了做到这一点,我经常发送http请求到维基百科API,它允许你在时间接收500个标题,并且还返回一个apcontinuestring,当在下面的请求中使用时,将返回从该string开始的标题。 为了做到这一点,我使用agentkeepalive模块: var http = require('http'); var Agent = require('agentkeepalive'); var keepaliveAgent = new Agent({ keepAlive: true, maxSockets: 5, timeout: 5000, keepAliveTimeout: 3000 }); 要发送一个http请求到维基百科,我使用下面的代码: function wikipediaApiCall(params, callback) { var options = { host: 'en.wikipedia.org', path: '/w/api.php?' + createParamString(params), method: 'GET', agent: keepaliveAgent }; var callbackFunc = function(response) { var err; var str = […]

节点http服务器4 x更快保持活动禁用?

保持活力应该加快网站。 但是,当我在铬(本地主机:8080)运行这个死了简单的服务器,我得到这些加载时间: 大约100毫秒与“连接:closures”标题(即与setHeader行未注释) 大约400毫秒,启用标准保持活动状态 。 我究竟做错了什么 ? 任何人都可以重现我的结果吗? 在过去的两天里,我一直在b my我的脑袋。 var fs = require('fs') // preparing 50 2k files … var a = [], txt = '/*\n' + 'x'.repeat(2000) + '\n*/' for (var i = 0; i < 50; i++) { var name = '/test' + i + '.js' fs.writeFile(__dirname + name, txt) a.push('<script src="' […]

Node.js设置setKeepAlive不停止与setTimeout超时

我想弄清楚Node.js的净类如何处理超时和keepalive。 我将它们设置在服务器端,观察设置这些variables有什么不同。 我注意到,如果我将Keepalive设置为以下内容: // Set keepalive socket.setKeepAlive( true, 30000 ); 它绝对会发送Keepalive数据包,我用Wireshark观察。 但是,即使我订阅套接字的超时事件,套接字也不会超时。 所以我尝试设置套接字的超时选项。 // Set timeout variables socket.setTimeout( 60000 ); 即使与keepAlive选项结合使用,在最后一次真正的传输数据包之后,套接字在60秒后仍然超时。 所以我的问题是,如果keepAlive没有做任何事情来防止套接字超时,那有什么意义呢?

在Node.js TCP套接字中testingKeepalive的function

我一直在testingNode.js TCP套接字中keepalive的function。 看来我在这里错过了一些东西! 这是我的服务器代码: var net = require('net'); function accept(socket) { socket.setKeepAlive(false); socket.on('data', function(data) { console.log("DATA"); console.log(data); }); socket.on('error', function (e) { console.log("ERROR"); console.log(e); }); socket.on('close', function () { console.log("CLOSE"); }); socket.on('end', function () { console.log("END"); }); socket.write("Hi"); } var server = net.createServer(accept); server.listen(8011); 这是我的客户代码: var net = require('net'); var socket = new net.Socket(); socket.setKeepAlive(false); […]

node.js中的socket.setTimeout()

我试图实现基于networking模块的HTTP服务器。 我需要实现保持活动,所以我打电话给sock.setKeepAlive(true) ,然后sock.setTimeout超时2秒后closures套接字。 这是我的代码: var server = net.createServer({ allowHalfOpen: false},socketListener); function start(port){ server.listen(port,'localhost'); } function socketListener(sock){ sock.setEncoding("utf8"); sock.setKeepAlive(true); sock.setTimeout(2000,function(){ sock.end("HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n"); }); sock.on("data",responser.responserCreator(sock,httpParser,baseDir,stat)); } 但是,当我第一次打开浏览器和http://localhost:1234/profile.html它工作正常,但如果我在2秒后刷新它会引发exception – 错误:Socket.writeAfterFIN [写入](net.js:274:12) 如果我评论超时everthing正常工作。 我的代码有什么问题?

closures连接而不是设置“保持活动”

我试图在一个非常简单的express应用程序禁用keep-alive设置。 我尝试了一个老版本的同样的答案 : var express = require('express'); var app = express(); app.get('/', function(req, res) { res.set('Connection', 'close'); // attempting to override default (keep-alive) res.set('Proof', 'close'); // just to show that this should modify the header value res.send('hello'); }); var server = app.listen(3000, function() { console.log('Listening on port %d', server.address().port); }); 但是, Connection仍然设置为keep-alive : $ curl […]

带保持活动标头的Node.js https.request

我想从用户的Facebook墙上拉post。 下面的代码片段工作,但它永远不会终止: var https = require('https'); facebookWall = function(user) { var options = { host: 'graph.facebook.com', port: 443, path: '/me/home?access_token=' + user.facebook_token + '&since=' + encodeURIComponent(user.facebook_timestamp), method: 'GET', headers: { 'Connection':'keep-alive' } }; var req = https.request(options) .on('response', function(response) { var body = ''; response.on('data', function(data) { body += data; try { var wallPosts = […]

PHP,nodeJS和会话

我有一个经典的Apache服务器提供的PHP文件,和一个nodeJS服务器(与socket.io,但没有快速/连接)用于实时事件pipe理该PHP网站。 我有时需要authentication连接到nodeJS服务器的客户端,但是当用户重新加载页面时,这个authentication会丢失,因为它也重新加载了socket.io客户端(我在服务器上存储了套接字ID,每次刷新都会丢失) 问题是:有没有办法保持连接在socket.io,或链接的Apache PHP会话和nodeJS服务器的方式? 或者也许一种方法来保持使用cookie的身份validation(知道我必须存储敏感数据,如用户密码和密钥)?