Gestion des délais avec Node.js et mongodb
Je suis actuellement en train de tester la façon dont certains de code se dresse contre le scénario suivant:
- Node.js l'application est lancé et réussi à établir une connexion avec mongodb
- Après il a réussi à établir une connexion, le serveur mongodb meurt et toutes les demandes ultérieures d'échouer
Pour ce faire, j'ai le code suivant qui permet d'utiliser le pilote officiel (trouvé ici: https://github.com/mongodb/node-mongodb-native) :
MongoClient.connect('mongodb://localhost:27017/testdb', function(err, db) {
app.get('/test', function(req, res) {
db.collection('users', function (err, collection) {
console.log(err);
if (err) {
//## POINT 1 ##
//Handle the error
}
else {
collection.find({ 'username': username }, { timeout: true }).toArray(function(err, items) {
console.log(err);
if (err) {
//## POINT 2 ##
//Handle the error
}
else {
if (items.length > 0) {
//Do some stuff with the document that was found
}
else {
//Handle not finding the document
}
}
});
}
});
});
});
Que le serveur mongodb n'est plus en cours d'exécution lorsque la demande est traitée, j'avais fait l'hypothèse que ce soit les points que j'ai étiqueté ## POINT 1 ## ou ##, POINT 2,##, il serait de retour un message d'erreur indiquant un délai d'attente; cependant, cela n'est pas le cas.
J'ai essayé un certain nombre de différents paramètres (y compris celui que vous pouvez voir ici, qui autorise explicitement le curseur de délai d'attente), mais je n'arrive pas à l'activer en aucune façon. Dans chaque configuration, j'ai essayé Node.js va tout simplement de garder en attente pour le trouver() opération de rappel et il ne fait jamais.
Si je commence le Node.js application avant mongodb en cours d'exécution, il attrape l'erreur dans la connexion en rappel très bien, mais si la connexion meurt après qu'il ne semble pas gérer cela de toute façon.
Est-il un paramètre que je suis absent ou est-il aucun moyen de détecter les connexions étant terminé après qu'ils ont été mis en place?
Edit: juste pour être clair, le nom d'utilisateur de la variable utilisée dans la méthode de recherche est effectivement déclaré dans mon code, le code que j'ai mis dans ce post est une version réduite pour illustrer la structure et la vérification d'erreur.
source d'informationauteur rastating
Vous devez vous connecter pour publier un commentaire.
UPD:
Basé sur ce post, on dirait qu'ils ont déployés correctif qui fera la même chose que ce que nous faisons ici. Vous ne savez pas si c'est déjà à l'intérieur de la ngp (15.10.13). https://github.com/mongodb/node-mongodb-native/issues/1092#ref-commit-2667d13
Après quelques recherches, j'ai réussi à comprendre ce qui se passe là:
Chaque fois que vous appelez une méthode pour traiter la base de données (trouver, update, insert, etc.) il crée curseur, qui dispose de son propre ID et enregistre lui-même à EventEmitter de Db pour être rappelé plus tard. En attendant, il s'inscrit à _notReplied objet au sein même CallBackStore.
Mais une fois que la connexion est fermée, je ne pouvais pas le localiser à tout ce qui pourrait parcourir _notReplied curseurs et serait les déclencher à des erreurs ou à toute logique avec des minuteries (cela pourrait quand même être quelque part par là). Donc j'ai réussi à écrire de petits travaux autour de, qui fait la force des déclencheurs de curseurs avec d'erreur lors de la DB émet
close
événement:Je recommande d'utiliser la première approche, au lieu de MongoClient. Les raisons sont que quelques-uns: par exemple lorsque vous fermez la connexion et ensuite appeler
.find
il sera correctement déclencher d'erreur dans le rappel, alors qu'avec MongoClient il ne sera pas.Si vous utilisez MongoClient:
Ce que cela va faire? Une fois la connexion est fermée, il va itérer sur Tous les _notReplied curseurs et de déclencher des événements pour eux avec l'erreur
Connection Closed!
.Cas de Test:
Qui va forcer la fermeture de connexion de base de données et de déclencher
close
événement qui vous gérer plus tôt et assurez-vous que le curseur sera fermé.UPD:
J'ai ajouté Problème sur GitHub: https://github.com/mongodb/node-mongodb-native/issues/1092 nous allons voir ce qu'ils disent à ce sujet.
Après une enquête, il semble que vous ne pouvez pas spécifier "hors ligne" délais d'attente comme dans le scénario décrit ci-dessus. Le seul délai qui peut être spécifié est celui qui informe le serveur en attente le curseur après 10 minutes d'inactivité, cependant, comme dans le scénario ci-dessus de la connexion au serveur est en panne, cela ne fonctionne pas.
Pour la référence, j'ai trouvé les informations ici: https://github.com/mongodb/node-mongodb-native/issues/987#issuecomment-18915263 en qui j'ai cru être l'un des principaux contributeurs au projet.
Je suis en train de faire de l'api du Hapi et Mongodb (w/o mangouste). Caractéristiques:
De combiner des idées à d'autres réponses et ce post https://productbuilder.wordpress.com/2013/09/06/using-a-single-global-db-connection-in-node-js/ mon approche est-ce:
server.js
Utilities.js
Je suis l'exportation db connexion à l'espace mondial. Il se sent comme pas la meilleure solution, mais j'avais des projets où la connexion db a été transmis en tant que paramètre à tous les modules et qui a sucé plus. Peut-être il devrait y avoir une approche modulaire où vous importez db connexion où vous en avez besoin, mais dans ma situation, j'ai besoin de presque partout, j'aurais à écrire qu'une déclaration dans la plupart des fichiers. Cette API est inutile w/o connexion à la db, donc je pense que ça pourrait être la meilleure solution, même si je suis contre le fait d'avoir quelque chose de voler comme par magie dans l'espace global..