在数据库问题中保留数据,在控制台上接收NULL

Non*_*Non 6 javascript node.js angularjs sails.js

我是NodeJS的新手,我在尝试在数据库中保存/保存一些数据时遇到问题.

让我们从头开始,这样你就可以更容易理解.我有一个运动列表,可选择选中或取消选中,这就是我需要坚持,检查的内容.

前端:

controller.js

$scope.toggleSportSelection = function(sport) {
  var params = {};
  params.user = $scope.customer.customer;
  sport.checked = !sport.checked;
  SportsFactory.setSportChecked(params);
};
Run Code Online (Sandbox Code Playgroud)

service.js

  setSportChecked: function(params) {
    var defer = $q.defer();
    $http.post(CONSTANT_VARS.BACKEND_URL + '/sports/checked', params)
    .success(function(sportChecked) {
        LocalForageFactory.remove(CONSTANT_VARS.LOCALFORAGE_SPORTS_CHECKED, params);
        defer.resolve(sportChecked);
      })
      .error(function(err) {
        console.log(err);
        defer.reject(err);
      });
    return defer.promise;
  }
Run Code Online (Sandbox Code Playgroud)

我一直在调试这个前端部分,一切似乎都没问题......

现在回到结束:

setSportCtrl.js

module.exports = {

  setCheck: function(req, res) {
    var checkedSportParams = req.body;

    SportSelectionService.sportChecked(checkedSportParams).then(function() {
      res.json(200, {msg: 'OK'});
    }, function(err) {
      res.json(400, err);
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

SportSelection.js(型号)

module.exports = {
  connection: 'RedisServer',
  attributes: {
    sport: {
      type: 'array',
      required: false
    },

    user: {
      type: 'string',
      required: true
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

在这部分我可以看到它console是如何在终端中打印的,但如果我这样做console.log(sportChecked)或者console.log(newSport)我得到的是一个阵列,它说null到处都是...

SportSelectionService.js

module.exports = {

  sportChecked: function(params) {
    var Promise = require('bluebird');
    return new Promise(function(fullfill, reject) {
      console.time('sportChecked_findOne');
      SportSelection.findOne({
        user: params.user
      }).exec(function(err, sportChecked) {
        console.timeEnd('sportChecked_findOne');
        var newSport;
        if (err) {
          reject(new Error('Error finding user'));
          console.error(err);
        }else if (sportChecked) {
          newSport =  sportChecked.sport;
          console.time('sportChecked_update');
          SportSelection.update({
            user: params.user
          },
          {
            sport: newSport
          }).exec(function(err, sportCheckedUpdated) {
            console.timeEnd('sportChecked_update');
            if (err) {
              reject(new Error('Error on sportChecked'));
            }else {
              fullfill(sportCheckedUpdated);
            }
          });
          if (sportChecked.sport) {
            sportChecked.sport.push(params.sport);
            console.log('New sport added');
          }else {
            sportChecked.sport = [params.sport];
          }
        }else {
          console.time('sportChecked_create');
          SportSelection.create({
            sport: [params.sport],
            user: params.user
          }).exec(function(err, created) {
              console.timeEnd('sportChecked_create');
              if (err) {
                reject(new Error('Error on sportChecked'));
              }else {
                fullfill(created);
              }
            });
        }
      });
    });
  }
Run Code Online (Sandbox Code Playgroud)

那你觉得我的问题在这里怎么样?我究竟做错了什么 ?

Jas*_*ust 1

如果您正在使用mongooseJS(看来您是)并且该服务的目的是将运动添加到 sports 数组中,那么您可以使用该findOneAndUpdate方法(它将返回该方法的承诺exec)并显着减少服务:

module.exports = {
  sportChecked: function(params) {
    return SportSelection.findOneAndUpdate(
      {user: params.user},
      {$addToSet: {sports: params.sport}}
    ).exec();
  }
};
Run Code Online (Sandbox Code Playgroud)

$addToSet仅当该值尚未存在于数组中时才会添加该值。如果可以接受重复项,您可以使用$push

正如评论中指出的,您可能正在使用水线。如果是这样,则该update方法的行为似乎与 类似findOneAndUpdate。所以也许这可能有效(我没有检查你是否需要打电话exec):

module.exports = {
  sportChecked: function(params) {
    return SportSelection.update(
      {user: params.user},
      {$addToSet: {sports: params.sport}}
    ).exec(); // Not sure if this is necessary
  }
};
Run Code Online (Sandbox Code Playgroud)