【问题标题】:How to avoid duplicate code blocks in node.js如何避免 node.js 中的重复代码块
【发布时间】:2016-07-01 09:55:29
【问题描述】:

我有一个包含 if else 的代码块,并且 if 和 else 中的大部分代码是相同的,但是由于一个带有回调的函数调用,我必须在 if 和 else 块中使用完全相同的代码。我知道可以为此目的创建一个函数,但它需要我传递太多参数。这是代码块:

if (results[0].register_type == 'D') {
                sessionData.register_type = results[0].register_type;
                UserModel.updategcm_id(req.body, function (err, result) {
                    UserSessionModel.createSessionToken(sessionData, function (err, result, token) {
                        if (err) {
                            res.status(400).send(self.createResponse({}, {
                                success: false,
                                message: err.message
                            }));
                            return false;
                        }
                        res.status(200).send(self.createResponse({
                            token: token,
                            userid: results[0].id
                        }, {
                                success: true,
                                message: "User has logged in successfully"
                            }));
                        console.log("User has logged in successfully...\n");
                    });
                });
            } else {
                UserSessionModel.createSessionToken(sessionData, function (err, result, token) {
                    if (err) {
                        res.status(400).send(self.createResponse({}, {
                            success: false,
                            message: err.message
                        }));
                        return false;
                    }
                    res.status(200).send(self.createResponse({
                        token: token,
                        userid: results[0].id
                    }, {
                            success: true,
                            message: "User has logged in successfully"
                        }));
                    console.log("User has logged in successfully...\n");
                });
            }

【问题讨论】:

  • 使用带参数的函数。
  • 你为什么不直接创建一个函数并将err、results和token传递给它呢?
  • @Seonixx:实际上他已经在创造那个功能了。 (两次)。
  • @Bergi 啊是的 - 我的错。

标签: javascript node.js express callback


【解决方案1】:

我认为最好的解决方案是将重复的函数移动到函数声明中,然后将其作为回调传递。您的代码将更改为:

if (results[0].register_type == 'D') {
    sessionData.register_type = results[0].register_type;
    UserModel.updategcm_id(req.body, function (err, result) {
        UserSessionModel.createSessionToken(sessionData, validateResponse);
    });
} else {
    UserSessionModel.createSessionToken(sessionData, validateResponse);
}

function validateResponse(err, result, token) {
    if (err) {
        res.status(400).send(self.createResponse({}, {
            success: false,
            message: err.message
        }));
        return false;
    }
    res.status(200).send(self.createResponse({
        token: token,
        userid: results[0].id
    }, {
        success: true,
        message: "User has logged in successfully"
    }));
    console.log("User has logged in successfully...\n");
}

现在代码更干净了。

您也可以将整个createSessionToken 调用分解为一个函数,但您必须小心传递sessionDataselfres(取决于它们各自的范围)。

【讨论】:

  • 您可能需要绑定self,具体取决于您放置validateResponse 的范围。
  • 你是对的,但这取决于代码的其余部分。我会编辑回复,谢谢!
【解决方案2】:

你可以使用异步模块,这样你就不需要重复这个功能了。

【讨论】:

  • 你能指出我应该在异步文档中查看的确切位置:caolan.github.io/async/docs.html 吗?我不确定应该在文档中搜索什么。
  • 执行 npm install --save async,然后在你的服务器文件中 require 模块。之后关注link
猜你喜欢
  • 2019-02-26
  • 2011-08-29
  • 1970-01-01
  • 2012-05-02
  • 2023-03-24
  • 2021-03-13
  • 2020-08-31
  • 2012-06-19
相关资源
最近更新 更多