2016-07-06 155 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