nrm
nrm

Reputation: 153

update a variable inside loop

I am trying to update var inside a loop that is then returned to a promise. But the var fails to update. So far I have tried this,

var queryPromise = cronie.find({}).
    where('id').equals(req.user._id).
    exec();  //mongoose promise


    queryPromise.then(function(timer) { 
        for (var i = 0, len = timer.length; i < len; i++) {
            x = moment.unix(timer[i].nextTick).format('dddd, MMMM Do, YYYY h:mm:ss A');  //convert to human;
            console.log(x);
            timer[i].nextTick = x;
            console.log(timer[i].nextTick);
          }

          return timer;
    }).then(function(timer) { 
        res.render('dash.ejs', {
            user: req.user,
            timer: timer
        });

    });
});

This is the outputs:

0|server   | Monday, May 21st, 2018 11:00:00 PM
0|server   | 1526943600
0|server   | Monday, May 21st, 2018 7:28:22 PM
0|server   | 1526930902
0|server   | Monday, May 21st, 2018 7:28:22 PM
0|server   | 1526930902
0|server   | Monday, May 21st, 2018 7:28:22 PM
0|server   | 1526930902
0|server   | Monday, May 21st, 2018 7:28:22 PM
0|server   | 1526930902

But timer[i].nextTick remains unchanged. How do I update it before sending it to render so that users can see human time instead of a stamp?

UPDATE Slice of the timer array

0|server   |   { _id: 5b031dd6c0d99f79946f263f,
0|server   |     id: '5b031dd5c0d99f79946f263a',
0|server   |     lastTick: 1526930902,
0|server   |     nextTick: 1526930902,
0|server   |     lastUpdate: 1526930902,
0|server   |     __v: 0,
0|server   |     timerStatus: false,
0|server   |     emailStatus: false } 

UPDATE 2

adding

timer[i].date =  moment.unix(timer[i].nextTick).format('dddd, MMMM Do, YYYY h:mm:ss A');

then changing ejs to timer.date works. But assigining nextTick still does not.

Upvotes: 0

Views: 114

Answers (1)

Gabriele Petrioli
Gabriele Petrioli

Reputation: 196002

You can use .lean() to make the returned document be a plain javascript object. This way you can manipulate it at will, later on.

var queryPromise = cronie.find({}).
    where('id').equals(req.user._id).
    lean(). // make returned document be a plain js object
    exec();  //mongoose promise

Documents returned from queries with the lean option enabled are plain javascript objects, not MongooseDocuments. They have no save method, getters/setters or other Mongoose magic applied.

Upvotes: 1

Related Questions