Piyush Arora
Piyush Arora

Reputation: 138

How to avoid duplicate code blocks in node.js

I have a code block containing if else and most of the code in if and else is same, but due to one function call with callback, I have to quite a same code in both if and else block. I know a function can be created for this purpose but it will require me to pass too many paramaters. Here is the code block:

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

Upvotes: 0

Views: 1300

Answers (2)

Garima
Garima

Reputation: 1666

You may use async module, so that you don't need to repeat the function.

Upvotes: 0

miquelarranz
miquelarranz

Reputation: 894

I think that the best solution is to move the repeated function to a function declaration and just pass it as callback. Your code would change to:

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

The code is much more clean now.

You could also factor out the whole createSessionToken call into a function, but you'd have to be careful with passing sessionData, self and res (depending on their respective scope).

Upvotes: 1

Related Questions