1

I'm using node.js express MongoDB and Mongoose to create rest api for my app. I'm wondering that there is any kind of type to replace such code like below for more generic? I do not want to pass all params all the time, but in only certain time. The most of time I just want to pass a part of them. Normally in Java, I create builder for such stuff, but I don't know any tricks for Javascript :)

exports.getMessages = function (req, res) {

    var from = req.query.from;
    var deleted = req.query.deleted;
    var readed = req.query.readed;

    if(from && deleted && readed) {
        Message.find({to: req.user.email, from: from, deleted: deleted, readed: readed}, function(err, messages) {
            if(err) {
                res.send(err);
            }
            res.json(messages);
        })
    } else if(from && deleted) {
        Message.find({to: req.user.email, from: from, deleted: deleted}, function(err, messages) {
            if(err) {
                res.send(err);
            }
            res.json(messages);
        })
    } else if (from && readed) {
        Message.find({to: req.user.email, from: from, readed: readed}, function (err, messages) {
            if(err) {
                res.send(err);
            }
            res.json(messages);
        });
    } else if(deleted && readed) {
        Message.find({to: req.user.email, deleted: deleted, readed: readed}, function (err, messages) {
            if(err) {
                res.send(err);
            }
            res.json(messages);
        });
    } else if(deleted){
        Message.find({to: req.user.email, deleted: deleted}, function(err, messages) {
            if(err) {
                req.send(err);
            }
            res.json(messages);
        })
    } else if(readed){
        Message.find({to: req.user.email, readed: readed}, function(err, messages) {
            if(err) {
                req.send(err);
            }
            res.json(messages);
        });
    } else if(from){
        Message.find({to: req.user.email, from: from}, function(err, messages) {
            if(err) {
                req.send(err);
            }
            res.json(messages);
        });
    }
};

1 Answer 1

1

Just build your find query object conditionally, i think this is as generic as it can get, just add to allowedParams as needed

exports.getMessages = function (req, res) {

    var allowedParams = [
        'deleted',
        'readed',
        'from'
    ];

    var query = {
        to: req.user.email
    };

    for(param in req.query) {
        if(allowedParams.indexOf(param) !== -1) {
            query[param] = req.query[param];
        }
    }

    Message.find(query, function (err, messages) {
        if(err) {
            res.send(err);
        }
        res.json(messages);
    });
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.