Questo è un po 'poco chiaro per me (sto solo iniziando con Node e Mongo), e mi preoccupa davvero a causa delle prestazioni e della tensione del server (che credo sia un'altra domanda, ma arriverò a quello alla fine del post).Qual è la procedura migliore per le connessioni MongoDB su Node.js?
Quindi, assumendo sto scrivendo un API con Node.js e Restify, dove ogni endpoint API corrisponde ad una funzione, devo:
a) aprire la connessione db e memorizzarlo in un globale var, e quindi basta usarlo in ogni funzione?
Esempio:
// requires and so on leave me with a db var, assume {auto_reconnect: true}
function openDB() {
db.open(function(err, db) {
// skip err handling and so on
return db;
}
}
var myOpenDB = openDB(); // use myOpenDB in every other function I have
b) aprire la connessione db e poi basta mettere tutto in una chiusura gigante?
Esempio:
// same as above
db.open(function(err, db) {
// do everything else here, for example:
server.get('/api/dosomething', function doSomething(req, res, next) { // (server is an instance of a Restify server)
// use the db object here and so on
});
}
c) aprire e chiudere il db ogni volta che è necessario?
Esempio:
// again, same as above
server.get('/api/something', function doSomething(req, res, next) {
db.open(function(err, db) {
// do something
db.close();
});
});
server.post('/api/somethingelse', function doSomethingElse(req, res, next) {
db.open(function(err, db) {
// do something else
db.close();
});
});
Quest'ultimo è quello che vorrei fare di intuizione, ma allo stesso tempo non mi sento del tutto comodo fare questo. Non mette troppo a dura prova il server Mongo? Soprattutto quando (e spero di arrivarci) ottengono centinaia - se non migliaia - di chiamate come questa?
Grazie in anticipo.
Si noti che per l'opzione B, è possibile evitare facilmente la chiusura massiccia utilizzando le funzioni con nome, evitando così l'inferno di callback. Detto questo, se stai usando il nodo, stai usando i moduli (spero!) Che significa che è OK avere (un piccolo numero di dichiarate!) Variabili globali - non inquinano lo spazio dei nomi di nessuno, poiché nulla lascia il File '.js' ad eccezione delle esportazioni del modulo. – Gijs
Grazie! Quindi mi suggerisci di usare l'opzione B? Ho scavato intorno al [gruppo di Google] del driver (https://groups.google.com/forum/?fromgroups#!forum/node-mongodb-native) e tutti sembrano suggerire qualche forma di riutilizzo della connessione (la maggior parte di loro in realtà suggerisce qualcosa come l'opzione B). – ArturoVM
D'altra parte, ho letto da qualche parte che fare tutto sotto la stessa connessione sta bloccando, vanificando lo scopo della natura asincrona di Node. – ArturoVM