MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Le rappel Node.js avec la mise à jour de MongoDB ne revient jamais bien qu'il mette à jour la base de données

Je pense que vous comprenez mal comment async.series fonctionne.

Vos fonctions dans async.series ne pas prendre de callback comme argument et ils ne l'appellent pas. Et cette request(...) stuff n'est probablement pas une fonction du tout. C'est probablement pourquoi il casse la boucle asynchrone. Essayez ceci :

async.series(
    [
        function(callback) { // <--- missing callback
            log('starting');
            db.connect('mongodb://127.0.0.1:27017/test',
                function(err, base){
                    if(err) throw err;
                    db = base;
                    callback(); // <--- missing callback
                });
        },
        function(callback) { // <--- missing function with callback
            request(website, function(err,resp,body) {
                start(err, resp, body, callback);
            })
        }
    ],
    function(){
        log('closing DB');
        db.close();
    }
);

Notez que j'ai ajouté callback argument lors de l'appel de start . Ainsi vous devrez refactoriser fortement votre code pour que chaque fonction accepte le callback qui peut être appelé à la fin lorsque vous savez que tous les travaux sont terminés. Par exemple, vous pouvez ajouter async.parallel à l'intérieur de start et cette fonction peut ressembler à ceci :

function start(err, resp, body, callback) {
    // some stuff happens here
    var jobs = []
    pageURLS.forEach(function(url, index, array){
        jobs.push(function(clb) {
            request(url, function(error,response,bodies) {
                // some stuff
                clb(); // <--- this refers to the local callback for the job
            });
        });
    });
    async.parallel(jobs, function() {
        // all jobs are done, let's finilize everything
        callback();
    });
};