重构DRY的节点代码(不要重复你的自己)

问题描述 投票:0回答:1

有下面的代码

exports.list_tum_izinler = function (req, res) {
    var _user = toknHelper.getUserFromToken(req);
    izinler.list_Izinler(_user.username, sendResult);

    function sendResult(data) {
        if (data instanceof Error) {
            res.status(500).send(data.message);
            return;
        }
        res.status(200).send(data);
    }
}

exports.Izin_Counts= function (req, res) {
    var _user = toknHelper.getUserFromToken(req);
    izinler.Count_Izinler(_user.username, sendResult);

    function sendResult(data) {
        if (data instanceof Error) {
            res.status(500).send(data.message);
            return;
        }
        res.status(200).send(data);
    }

这里我试图将代码重构为DRY,我想提取这一部分

 function sendResult(data) {
        if (data instanceof Error) {
            res.status(500).send(data.message);
            return;
        }
        res.status(200).send(data);
    }

作为外部函数并将数据和res参数发送到该函数。这里数据参数从函数返回的点和res参数是一个外部参数,所以我怎么能用数据参数发送res参数。

node.js refactoring
1个回答
0
投票

创建一些其他文件... myFunction.js:

const sendResult = ({ res, data }) => {
  if (data instanceof Error) {
    res.status(500).send(data.message);
    return;
  }
  res.status(200).send(data);
};

module.exports = sendResult;

然后,将其输入到当前代码中:

const sendResult = require('./myFunction');

exports.list_tum_izinler = function (req, res) {
    var _user = toknHelper.getUserFromToken(req);
    izinler.list_Izinler(_user.username, sendResult);
}

您需要意识到您正在使用此函数作为回调,因此如果您想要将此函数提供给izinler.Count_Izinler(_user.username, sendResult),那么您需要修改该函数以正确地为其提供响应。因此您还需要通过响应该函数并在需要时将其提供给回调:

const Count_Izinler(username, res, callback) => {
  // dunno what this function does... but maybe it gets data somewhere
  let data = 'some data';
  callback({res, data});
}

但是,如果您要这样做,您可能只需要将该函数放入实现本身,而不是在高阶函数中,并将其作为回调删除:

const sendResult = require('./path/to/myFunction');

const Count_Izinler(username, res) => {
  // dunno what this function does... but maybe it gets data somewhere
  let data = 'some data';
  return sendResult({res, data});
}

const list_izinler(username, res) => {
  // dunno what this function does... but maybe it gets data somewhere
  let data = 'some data';
  return sendResult({res, data});
}

然后,您将调用这些函数:

izinler.list_Izinler(_user.username, res);

但是,说实话,这会造成大量代码混乱并使人们感到困惑。它变得远不那么可维护。你未来的自我会恨你做这件事。我建议你从dataCount_Izinler返回list_Izinler,然后将它喂入你的sendResult ......就像这样:

const sendResult = require('./myFunction');

exports.list_tum_izinler = function (req, res) {
    var _user = toknHelper.getUserFromToken(req);
    const data = izinler.list_Izinler(_user.username); // <-- modify this function to only take user name, and RETURN whatever it does, which is the "data"
    return sendResult({res, data});
}

exports.Izin_Counts= function (req, res) {
    var _user = toknHelper.getUserFromToken(req);
    const data = izinler.Count_Izinler(_user.username); // <-- modify this function to only take user name, and RETURN whatever it does, which is the "data"
    return sendResult({res, data});
}

不幸的是,你遗漏了其他代码片段,例如list_IzinlerCount_Izinler,以便有人完全给你一个100%准确的答案。如果您想要更清楚的答案,请提供更多其他功能的代码片段。

编辑:使用async / await ..

exports.list_tum_izinler = async function (req, res) { // <-- specify the function as async...
    var _user = toknHelper.getUserFromToken(req);
    const data = await izinler.list_Izinler(_user.username); // <-- use "await" before the invocation.  This function must return a promise in order for this to work.  If it does not, list_Izinler needs to be modified to return a promise... mostly a trivial thing to do...
    return sendResult({res, data});
}
© www.soinside.com 2019 - 2024. All rights reserved.