2017-10-27 6 views
2

im genannt wurde mit diesem Code versuchen und zu versuchen, Daten zu erhalten und sie zu senden FunktionuncaughtException: Rückruf bereits in Knoten js

immer diese Fehlermeldung uncaughtException zum nächsten Rückruf: Rückruf wurde bereits im Knoten js genannt

function (results, done) { 
     // sales manager condition 
     var companysalesId = []; 
     if (results && results.length > 0 && req.tokenInfo && req.tokenInfo.loginType === 'employee' && req.tokenInfo.role === config.roleData.sm) { 
     results.forEach(function (v, i) { 
      var userJson = { active: true, salesRep: { '$in': v._id } }; 
      User.find(userJson).exec(function (err, users) { 
      if (err) { 
       console1.error('Error:User:UsersResults: ' + errorHandler.getErrorMessage(err)); 
       return res.status(config.errorStatus).send({ 'errorCode': config.statusCodes.ERROR, errorMessage: errorHandler.getErrorMessage(err) }); 
      } else { 
       if (users && users.length > 0) { 
       users.forEach(function (val, ind) { 
        companysalesId.push(val.companyId); 
       }); 
       } 
       if (filter.filter && !filter.filter.companyId) { 
       filter.filter.companyId = { '$in': companysalesId }; 
       } 
       done(); 
      } 
      }); 
     }); 
     } else if (results && results.length == 0) { 
     if (filter.filter && !filter.filter.companyId) { 
      filter.filter.companyId = { '$in': companysalesId }; 
     } 
     done(); 
     } else { 
     done(); 
     } 
    } 

Antwort

0

Gut! Das Problem besteht darin, dass Sie den Rückruf in einer forEach-Schleife ausführen. Kein Wunder, dass es sich über mehrere Rückrufe beschwert.

Was sollten Sie wirklich tun (vorausgesetzt, dies ist eine Express-Handler-Funktion) wird nur die aus der Schleife done Rückruf bewegen:

if (results && results.length > 0 && req.tokenInfo && req.tokenInfo.loginType === 'employee' && req.tokenInfo.role === config.roleData.sm) { 
    results.forEach(function (v, i) { 
    var userJson = { active: true, salesRep: { '$in': v._id } }; 
    User.find(userJson).exec(function (err, users) { 
     if (err) { 
     console1.error('Error:User:UsersResults: ' + errorHandler.getErrorMessage(err)); 
     return res.status(config.errorStatus).send({ 'errorCode': config.statusCodes.ERROR, errorMessage: errorHandler.getErrorMessage(err) }); 
     } else { 
     if (users && users.length > 0) { 
      users.forEach(function (val, ind) { 
      companysalesId.push(val.companyId); 
      }); 
     } 
     if (filter.filter && !filter.filter.companyId) { 
      filter.filter.companyId = { '$in': companysalesId }; 
     } 
     } 
    }); 
    }); 
    done(); 
} 

Other than that, sollten Sie immer return versuchen, den Rückruf:

return done(); 

Sie werden also tatsächlich die Ausführung stoppen und sich nicht in Situationen wie diese versetzen.