web-dev-qa-db-fra.com

Le rappel était déjà appelé parallèle asynchrone

Salut, j'essaie d'utiliser le module Async pour récupérer deux utilisateurs et effectuer un traitement après qu'ils ont tous deux été récupérés, mais je reçois toujours le message d'erreur: Le rappel a déjà été appelé. Voici le code que j'ai actuellement:

app.get('/api/addfriend/:id/:email', function(req, res) {
    var id = req.params.id;
    var friendEmail = req.params.email;
    async.parallel([
            //get account
            function(callback) {
                accountsDB.find({
                    '_id': ObjectId(id)
                }, function(err, account) {
                    console.log(id);
                    if (err || account.length === 0) {
                        callback(err);
                    }
                    console.log(account[0]);
                    callback(null, account[0]);
                });
            },
            //get friend
            function(callback) {
                accountsDB.find({
                    'email': friendEmail
                }, function(err, friend) {
                    console.log(friendEmail);
                    if (err || friend.length === 0 || friend[0].resId === undefined) {
                        callback(err);
                    }
                    console.log(friend[0]);
                    callback(null, friend[0].resId);
                });
            }
        ],

        //Compute all results
        function(err, results) {
            if (err) {
                console.log(err);
                return res.send(400);
            }

            if (results === null || results[0] === null || results[1] === null) {
                return res.send(400);
            }

            //results contains [sheets, Friends, Expenses]
            var account = results[0];
            var friend = results[1];
            if (account.friends_list !== undefined) {
                account.friends_list = account.friends_list + ',' + friend;
            }
            else {
                account.friends_list = friend;
            }
            // sheetData.friends = results[1];
            accountsDB.save(
                account,
                function(err, saved) {
                    if (err || !saved) {
                        console.log("Record not saved");
                    }
                    else {
                        console.log("Record saved");
                        return res.send(200, "friend added");
                    }
                }
            );

        }
    );
});

Toute aide serait appréciée.

15
sazap10

Ajoutez l'instruction else à votre code, car si vous obtenez une erreur, votre rappel s'exécute deux fois

if (err || account.length === 0) {
  callback(err);
} else {
  callback(null, account[0]);
}
22
Alexander T.

Les documents d'Async disent en fait :

Assurez-vous de toujours revenir lorsque vous appelez un rappel tôt, sinon vous provoquerez plusieurs rappels et un comportement imprévisible dans de nombreux cas.

Vous pouvez donc faire:

return callback(err);
9
ctindel