Node.js https.demande avec keep-alive-tête
Je veux tirer les posts d'un utilisateur Facebook mur.
L'extrait de code suivant fonctionne, mais elle ne se termine:
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 = JSON.parse(body);
console.log("user " + user.id + " has " + wallPosts.data.length + " new items on their wall");
}
catch (e) {
//console.log("waiting for more data chunks...");
}
})
});
req.end();
req.on('error', function(e) {
console.error(e);
});
}
Je pense que c'est causé par le 'Connection':'keep-alive'
en-tête. Quand je le remplace par 'Connection':'close'
le script sera terminé lorsque toutes les données ont été récupérées à partir de facebook.
J'espère être en mesure d'utiliser le keep-alive-tête pour éviter d'avoir à créer une nouvelle connexion SSL pour chaque demande. J'ai des milliers de demandes et avec le keep-alive-tête, il se termine en quelques secondes, par opposition à quelques minutes sans le keep-alive-tête.
Personne ne sait comment faire cela? Je suis assez nouveau à l'Node.JS donc si je suis absent quelque chose d'évident, je m'en excuse.
OriginalL'auteur Teetotum | 2011-06-13
Vous devez vous connecter pour publier un commentaire.
C'est parce que keep-alive n'est pas encore mis en œuvre pour https/ssl/tls
dans l'étape 4.x et je crois que pour les 6.x aussi. C'est pourquoi, dans le nœud websocket-serveur
il ne fonctionne pas aussi bien, voir https://github.com/nephics/node-websocket-server/commit/3a732bff6aabe694834d87086a7718be7c0ce138
OriginalL'auteur Mikhail.Mamaev
J'ai remarqué que vous êtes en utilisant le protocole https. Dépend de la version de nœud que vous utilisez, mais il existe un problème connu avec la fin de l'événement dès maintenant.
https://github.com/joyent/node/issues/728
OriginalL'auteur Josh
Vous devez faire ce qui suit:
1) Mettre la réponse.('fin', function() { ... faire de la sortie ... }); pour le https.demande
Ne pas émettre données dans la réponse.('données', ...);
2) Utiliser la Connection:keep-alive "fermer", très pauvres problème de performance. J'ai fait beaucoup de tests et je peux vous le confirmer.
Autres que:
3) Dans vos options , définissez l'agent, et l'ensemble de l'agent.maxSockets à un plus grand nombre si vous avez besoin de simultanéité. par défaut n'est que de 5.
4), Vous devriez envisager de faire votre propre routine pour gérer le protocole https.demande de délai d'attente. (s'il vous plaît aller à github/joyent et de recherche pour elle. utiliser setTimeout d'émettre une erreur de dépassement de délai).
OriginalL'auteur murvinlai