2016-07-06 121 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中,我正在進行另一個數據庫調用,我如何使用回調來處理錯誤,因爲我返回false,但顯然這不起作用。 – DennisTurn

+0

@DennisTurn,直接從'getMod'調用'cb(false)' – Rayon

+0

@DennisTurn - 我不想回答這個問題。做控制檯'cb'並找出它是什麼。我希望探索'回調'會很有趣。 – Rayon