cphill
cphill

Reputation: 5914

SequelizeJS Using If Condition with Query Parameter

I have an app route where I want to be able to use query parameters for my where clauses if there is a query present. My initial approach was to use an if/else clause in the get and return two different queries depending on if the query parameters were present, but I get a SyntaxError: Unexpected token . error at my then(function..., which is telling me that this isn't the right approach. How can I achieve something with Sequelize?

/*====   /  ====*/

appRoutes.route('/') 

    .get(function(req, res){

        console.log(req.query.dataDateStart);
        console.log(req.query.dataDateEnd);

        if(req.query.dataDateStart && req.query.dataDateEnd){
        return models.Comment.findAll({
            where: {
                dataDateStart: {
                    $gte: dateFormatting(req.body.dataDateStart)
                },
                dataDateEnd: {
                    $lte: dateFormatting(req.body.dataDateEnd)
                }
            },
            order: 'commentDate DESC',
            include: [{
                model: models.User,
                where: { organizationId: req.user.organizationId },
                attributes: ['organizationId', 'userId']
            }],
            limit: 10
        })
        } else {
        return models.Comment.findAll({
            order: 'commentDate DESC',
            include: [{
                model: models.User,
                where: { organizationId: req.user.organizationId },
                attributes: ['organizationId', 'userId']
            }],
            limit: 10
        })
        }

        .then(function(comment){
            function feedLength(count){
                if (count >= 10){
                    return 2;
                } else {
                    return null;
                }
            };

            res.render('pages/app/activity-feed.hbs',{
                comment: comment,
                user: req.user,
                secondPage: feedLength(comment.length)
            });
        });
    })

    .post(function(req, res){
        function dateFormatting(date){
            var newDate = new Date(date); 
            return moment.utc(newDate).format();
        }

        console.log("This is a date test" + dateFormatting(req.body.dataDateStart));
        //Testing if the query will come through correctly.
        models.Comment.findAll({
            order: 'commentDate DESC',
            where: {
                dataDateStart: {
                    $gte: dateFormatting(req.body.dataDateStart)
                },
                dataDateEnd: {
                    $lte: dateFormatting(req.body.dataDateEnd)
                }
            },
            include: [{
                model: models.User,
                where: { 
                    organizationId: req.user.organizationId,
                },
                attributes: ['organizationId', 'userId']
            }],
            limit: 10
        }).then(function(filterValues) { 
            var dataDateStart = encodeURIComponent(dateFormatting(req.body.dataDateStart));
            var dataDateEnd = encodeURIComponent(dateFormatting(req.body.dataDateEnd));
            res.redirect('/app?' + dataDateStart + '&' + dataDateEnd);
        }).catch(function(error){
            res.send(error);
        })
    });

Upvotes: 1

Views: 1557

Answers (1)

Steffen Langer
Steffen Langer

Reputation: 1193

This is a syntax error. The then function can only be called on a thenable object. In the code snipped above, .then is applied to nothing. Instead, it is called after an if-else statement.

if(...) {
  ...
}
else {
  ...
}
// .then() is not called on any object --> syntax error 'unexpected "."'
.then()

If you just want to configure the where parameters, you could define the where object depending on the url queries. appRoutes.route('/')

.get(function(req, res){

    console.log(req.query.dataDateStart);
    console.log(req.query.dataDateEnd);

    var whereObject = {};
    // CHeck for queries in url
    if(req.query.dataDateStart && req.query.dataDateEnd){
        whereObject = {
            dataDateStart: {
                $gte: dateFormatting(req.body.dataDateStart)
            },
            dataDateEnd: {
                $lte: dateFormatting(req.body.dataDateEnd)
            }
        };
    }

    models.Comment.findAll({
        where: whereObject,
        order: 'commentDate DESC',
        include: [{
            model: models.User,
            where: { organizationId: req.user.organizationId },
            attributes: ['organizationId', 'userId']
        }],
        limit: 10
    })
    .then(function(comment){
        function feedLength(count){
            if (count >= 10){
                return 2;
            } else {
                return null;
            }
        };

        res.render('pages/app/activity-feed.hbs',{
            comment: comment,
            user: req.user,
            secondPage: feedLength(comment.length)
        });
    });
})

.post(function(req, res){
    function dateFormatting(date){
        var newDate = new Date(date);
        return moment.utc(newDate).format();
    }

    console.log("This is a date test" + dateFormatting(req.body.dataDateStart));
    //Testing if the query will come through correctly.
    models.Comment.findAll({
        order: 'commentDate DESC',
        where: {
            dataDateStart: {
                $gte: dateFormatting(req.body.dataDateStart)
            },
            dataDateEnd: {
                $lte: dateFormatting(req.body.dataDateEnd)
            }
        },
        include: [{
            model: models.User,
            where: {
                organizationId: req.user.organizationId,
            },
            attributes: ['organizationId', 'userId']
        }],
        limit: 10
    }).then(function(filterValues) {
        var dataDateStart = encodeURIComponent(dateFormatting(req.body.dataDateStart));
        var dataDateEnd = encodeURIComponent(dateFormatting(req.body.dataDateEnd));
        res.redirect('/app?' + dataDateStart + '&' + dataDateEnd);
    }).catch(function(error){
        res.send(error);
    })
});

Upvotes: 3

Related Questions