Sails.js增量属性

时间:2015-03-28 15:43:15

标签: javascript node.js model-view-controller sails.js

我使用Sails.js,并在调用函数时尝试将模型中的属性递增1。它工作并递增并返回值为1的JSON,但从不保存到数据库,因此当我稍后发出get请求时,该值仍为0.

功能:

addVote: function (req, res, next) {

    Nomination.findOne(req.param('id'), function foundNomination(err, nom) {
      if(err) return next(err);

      if(!nom) return next();

      Nomination.update(req.param('id'), {
        votes: nom.votes++
      })

      return res.json({
        votes : nom.votes
      });

    });
},

编辑:

现在这很奇怪。必须是一些范围问题。当我将代码更改为此时,控制台输出0然后1.如果我取出第二个console.log,它输出1 ......

addVote: function (req, res, next) {
    var newVotes = 0;

    Nomination.findOne(req.param('id'), function foundNomination(err, nom) {
      if(err) return next(err);
      if(!nom) return next();

      nom.votes++;
      newVotes = nom.votes;
      console.log(newVotes);
    });

    console.log(newVotes);

    Nomination.update(req.param('id'), {
        votes: newVotes
    }, function(err) {
        if(err) return res.negotiate(err);

        return res.json({
            votes : newVotes
        });
    });

},

AHHA!它在findOne之前调用Update函数。但为什么,我该如何阻止呢?

2 个答案:

答案 0 :(得分:1)

有点迟到了,但我可能有一个更简单的解决方法。当你将++放在一个数字后面时,它会向该值添加一个,但它会在执行此操作之前返回该值。如果你希望nom.votes的值增加1,你需要做的就是把++放在值之前,然后它会在添加一个之后返回值,如下所示:

for (i = 0; i < len_n; i++, len_n = i+1) {

答案 1 :(得分:0)

我认为你必须这样做:

nom.votes++; //or nom.votes = nom.votes+1;
Nomination.update(req.param('id'), 
      {
        votes: nom.votes
      }).exec(function(err, itemUpdated)
      {
         if(err)//error
         {
           //manage error 
         }
         else
         {
            res.json({
              votes : itemUpdated.votes
            });
         }
      });

所有数据库访问都是异步的,因此您必须在模型上为exec create ect ..调用update方法

最后你有:

addVote: function (req, res, next) {
    var newVotes = 0;

    Nomination.findOne(req.param('id'), function foundNomination(err, nom)
{
    if (err)
    {
        return next(err);
    }

    nom.votes++;
    newVotes = nom.votes;
    console.log(newVotes);
    Nomination.update(req.param('id'), {
        votes : newVotes
    }, function (err)
    {
        if (err)
        {
            return res.negotiate(err);
        }

        return res.json({
            votes : newVotes
        });
    });
});
},