2016-07-06 7 views
0

Ich bin ein wenig neu zu Express/Node.js/Mungo und ich bin in Callback-Hölle gelaufen. Was ich versuche zu tun, ist eine Anfrage in diese API-URL /page/module/add/:id, wenn erfolgreich Anruf buildMod(data), dann ruft diese Funktion getMod(data), und dann ruft diese Funktion writeMod(data) und schließlich möchte ich die true Wert wieder rechts auf meine router übergeben .Express-Router Callbacks

Sobald ich die Antwort habe, möchte ich es zurückgeben. Ich habe online recherchiert und es gibt nicht viele ähnlichen Situationen - ich persönlich denke, dass ich mich in tiefer zu haben ...

router.get('/page/module/add/:id', function(req, res) { 
    Client.find({"emailAddress": emailAddress, "sequence.slug": pageSlug}, 
{"emailAddress": 1, "sequence.$": 1}, function (err, data) { 
     if (!err) { 
      res.statusCode = 200; 

      buildMod(data); 

      return res.json(data); 
     } else { 
      res.statusCode = 500; 

      log.error('Internal error(%d): %s', res.statusCode, err.message); 

      return res.json({ 
       error: 'Server error' 
      }); 
     } 
    }).select('sequence emailAddress domain'); 
}); 


function buildMod(data) { 
    getMod(data); 
} 

function getMod(data) { 
    Module.find({ 'module_id': moduleNumID }, function (err, module) { 
     if(!module) { 
      return false; 
     } 

     if (!err) { 
      writeMod(data); 
     } else { 
      return false; 
     } 
    }); 

} 

function writeMod(data) { 
    fs.appendFile(location, content, function(err) { 
     if (err) throw err; 
     return true; 
    }); 
} 

Ich weiß, dass die Erklärungen für Rückrufe für die Funktionen falsch sind, aber ich habe schon versuchen und ich kann einfach nicht über diese Stufe zu kommen scheinen. Ich bin sicher, das ist definitiv möglich, jede Hilfe wird sehr geschätzt!

+0

'fs.appendFile' ist async und Sie können nicht zurück von' async' ruft .. Nutzen Sie 'callback' – Rayon

Antwort

3

ist asynchron und Sie können nicht von asynchronous Anrufe zurück.

Nutzen Sie callback

router.get('/page/module/add/:id', function(req, res) { 
 
    Client.find({ 
 
    "emailAddress": emailAddress, 
 
    "sequence.slug": pageSlug 
 
    }, { 
 
    "emailAddress": 1, 
 
    "sequence.$": 1 
 
    }, function(err, data) { 
 
    if (!err) { 
 
     res.statusCode = 200; 
 
     buildMod(data, function(data) { 
 
     res.json(data); 
 
     }); 
 
    } else { 
 
     res.statusCode = 500; 
 
     log.error('Internal error(%d): %s', res.statusCode, err.message); 
 
     return res.json({ 
 
     error: 'Server error' 
 
     }); 
 
    } 
 
    }).select('sequence emailAddress domain'); 
 
}); 
 

 

 
function buildMod(data, cb) { 
 
    getMod(data, cb); 
 
} 
 

 
function getMod(data, cb) { 
 
    writeMod(data, cb); 
 
} 
 

 
function writeMod(data, cb) { 
 
    fs.appendFile(location, content, function(err) { 
 
    if (err) throw err; 
 
    cb(true); 
 
    }); 
 
}

+0

Das perfekt ist. Eine letzte Frage, in getMod mache ich einen anderen Datenbankanruf, wie kann ich den Rückruf für Fehler verwenden, wie ich falsch zurückgebe, aber offensichtlich wird das nicht funktionieren. – DennisTurn

+0

@DennisTurn, Direkt aufrufen 'cb (false)' von 'getMod' – Rayon

+0

@DennisTurn - Ich möchte diese Frage nicht beantworten. Konsole 'cb' und finde heraus, was es ist .. Ich hoffe, es wird Spaß machen, 'Callbacks' zu erforschen .. – Rayon