2016-07-06 2 views
0

Я немного новичок в Express/Node.js/Mongoose, и я столкнулся с callback hell. То, что я пытаюсь сделать, это получить запрос на этот URL-адрес API /page/module/add/:id, если он успешно вызван buildMod(data), тогда эта функция вызывает getMod(data), а затем эта функция вызывает writeMod(data) и в конце концов я хочу передать значение true прямо обратно на мой router ,Ответные вызовы маршрутизатора

Как только у меня появится ответ, я хочу его вернуть. Я искал в Интернете, и там не так много подобных ситуаций - я лично думаю, что я должен себя слишком глубоко ...

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; 
    }); 
} 

Я знаю, что заявления неверны для функций для обратных вызовов, но я был и я просто не могу пройти мимо этого этапа. Я уверен, что это определенно возможно, любая помощь действительно оценена!

+0

'fs.appendFile' является асинхронной, и вы не можете вернуться из' async' звонки .. Используйте 'callback' – Rayon

ответ

3

fs.appendFile является асинхронным, и вы не можете вернуться с asynchronous звонков.

Воспользоваться 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

Это отлично. Один последний вопрос, в getMod Я делаю другой вызов базы данных, как я могу использовать обратный вызов для ошибок, поскольку я возвращаю false, но, очевидно, это не сработает. – DennisTurn

+0

@DennisTurn, Непосредственно вызывать 'cb (false)' из 'getMod' – Rayon

+0

@DennisTurn - я предпочел бы не отвечать на этот вопрос. Сделайте консоль 'cb' и узнайте, что это такое. Надеюсь, будет интересно исследовать« обратные вызовы ».. – Rayon

Смежные вопросы