快速路由器回调

Express router callbacks

本文关键字:回调 路由器      更新时间:2023-09-26

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

我知道回调函数的声明是错误的,但我一直在尝试,我似乎无法通过这个阶段。我相信这绝对是可能的,任何帮助都非常感谢!

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