2016-07-06 3 views
0

나는 Express/Node.js/Mongoose에 약간 새로운데, 나는 콜백 지옥을 만났다. 내가 뭘 하려는지는이 API URL /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에서 다른 데이터베이스 호출을하고 있습니다. 오류를 반환하기 위해 콜백을 어떻게 사용할 수 있습니까?하지만 분명히 작동하지 않습니다. – DennisTurn

+0

@DennisTurn,'getMod'에서 직접'cb (false)'를 호출하십시오. – Rayon

+0

@DennisTurn -이 질문에 답하지 않을 것입니다. 'cb'를 콘솔로 사용하여 무엇인지 알아보십시오. 콜백을 탐색하는 것이 재미있을 것입니다. – Rayon

관련 문제