jjzjj

javascript - 将数据保存在数据库问题中,在控制台上收到 NULL

coder 2024-12-26 原文

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

让我们从头开始,这样您会更容易理解。我有一个运动列表,可以选择选中或不选中,这就是我需要坚持的,选中的。

前端:

controller.js

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

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;
  }

我一直在调试这个前端部分,一切似乎都正常......

现在后端:

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);
    });
  }
}

SportSelection.js(模型)

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

    user: {
      type: 'string',
      required: true
    }
  }
};

在这部分我可以看到 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);
              }
            });
        }
      });
    });
  }

那么你认为我的问题是什么?我做错了什么?

最佳答案

这是我做的方法,我会从头到尾教你怎么做

从 Node.js 部分开始,我使用的是 Sails.js 和 lodash

SetSportsController.js

'use strict';

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);
    });
  },

  retrieveSetCheck: function(req, res) {
    if (req.params) {
      SportSelectionService.getSportChecked(req.params).then(function(sportChecked) {
        res.json(200, sportChecked);
      }, function(err) {
        res.json(400, err);
      });
    }else {
      res.json(400, {error: 'Error retrieving Sports'});
    }
  }
};

比起我们使用 SportSelectionService.js

'use strict';

var _ = require('lodash');

module.exports = {

  sportChecked: function(params) {
    var Promise = require('bluebird');
    return new Promise(function(fullfill, reject) {
      SportSelection.findOne({
        user: params.user
      }).exec(function(err, sportChecked) {//this array comes with duplicates
        var newSport,
            sportCheckedUniq = _.uniq(sportChecked.sport);//prevents duplicates
        if (err) {
          reject(new Error('Error finding user'));
          console.error(err);
        }else if (sportChecked) {
          newSport = sportCheckedUniq || [];
          if (_.includes(sportCheckedUniq, params.sport)) {
            sportCheckedUniq = _.pull(newSport, params.sport);
            sportCheckedUniq = _.difference(newSport, params.sport);
          }else {
            newSport.push(params.sport);
            sportCheckedUniq = newSport;
          }
          SportSelection.update({
            user: params.user
          },
          {
            sport: newSport
          }).exec(function(err, sportCheckedUpdated) {
            if (err) {
              reject(new Error('Error on sportChecked'));
            }else {
              fullfill(sportCheckedUpdated);
            }
          });
          if (sportCheckedUniq) {
            sportCheckedUniq.push(params.sport);
          }else {
            sportCheckedUniq = [params.sport];
          }
        }else {
          SportSelection.create({
            sport: [params.sport],
            user: params.user
          }).exec(function(err, created) {
              if (err) {
                reject(new Error('Error on sportChecked'));
              }else {
                fullfill(created);
              }
            });
        }
      });
    });
  },

  getSportChecked: 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');
        if (err) {
          reject(new Error('Error finding sportChecked'));
          console.error(err);
        }else {
          if (sportChecked) {
            fullfill(sportChecked);
          }else {
            SportSelection.create({
              // 10 is the ID for soccer, which must unchecked by default on every single user.
              sport: [10],
              user: params.user
            }).exec(function(err, created) {
              console.log(err);
              console.log(created);
              if (err) {
                reject(new Error('Error on sportChecked'));
              }else {
                fullfill(created);
              }
            });
          }
        }
      });
    });
  }
};

如你所见,我们只有两种方法,第一种

sportChecked() 是在用户选中或取消选中任何项目时触发的函数。

然后我们有 getSportChecked(),这是每次用户再次登录时调用的方法。

我没有任何删除方法,因为我们没有删除任何东西,我们只是在观察语句的变化。

我也在使用 Redis 服务器

不要忘记创建模型,我给它们起了个名字 SportSelection.js

'use strict';

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

    user: {
      type: 'string',
      required: true
    }
  }
};

此外,在配置文件夹中我们有 policies.js,我无法告诉您如何使用它,因为这是您的配置,但我的是:

  SetSportsController: {
    setCheck: ['jwtAuth', 'sanitizerPolicy', 'headersPolicy'],
    retrieveSetCheck: ['jwtAuth', 'sanitizerPolicy']
  },...

然后,我们转到前端部分(记住:AngularJS)

我有一个 Controller ,controller.js

$scope.toggleSportSelection = function(sport) {
  SportsFactory.setSportChecked({
    user: $scope.customer.customer,
    sport: sport.id
  }).then(function() {
    sport.checked = !sport.checked;
    $ionicScrollDelegate.resize();
  }, function() {
    $ionicScrollDelegate.resize();
  });
};

正在按照这个模板工作

  <ion-item ng-repeat="sport in sportsFilter track by $index"
            ng-click="toggleSportSelection(sport)">
    {{:: sport.name}}
  </ion-item>

然后,service.js

注意 AngularJS

这里是我发布帖子的地方,你看

  .factory('SportsFactory', function($http, $q, AuthFactory, LocalForageFactory,
                                     LeaguesFactory, ImageFactory, CONSTANT_VARS) {

  getSports: function(customer) {
    var defer = $q.defer(),
    _this = this;

    LocalForageFactory.retrieve(CONSTANT_VARS.LOCALFORAGE_SPORTS)
      .then(function(sports) {
        if (!_.isNull(sports)) {
          defer.resolve(sports);
        }else {
          $http.get(CONSTANT_VARS.BACKEND_URL + '/lines/sports/' + customer.agent)
            .success(function(sports) {
              sports = _.sortBy(sports, function(sport) {
                return sport.priority;
              });
              _this.getSportChecked(customer).then(function(sportChecked) {
                var sportIds = _.pluck(sports, 'id'),
                    intersectedSports = _.intersection(sportIds, sportChecked.sport);
                if (sports.length) {
                  sports = _.map(sports, function(sport) {
                    sport.checked = !_.includes(intersectedSports, sport.id);
                    return sport;
                  });
                }else {
                  AuthFactory.logout();
                }
              });
              _.each(sports, function(sport) {
                var sportImg = ImageFactory.sportImages(sport);
                if (sportImg.length) {
                  sport.img = sportImg[0];
                }else {
                  sport.img = 'https://placehold.it/40x40';
                }
              });
              defer.resolve(sports);
            })
          .error(function(err) {
            defer.reject(err);
          });
        }
      });
    return defer.promise;
  },

  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;
  },

  getSportChecked: function(customer) {
    var defer = $q.defer(),
        user,
        rejection = function(err) {
          defer.reject(err);
        };

    LocalForageFactory.retrieve(CONSTANT_VARS.LOCALFORAGE_SPORTS_CHECKED)
      .then(function(sportChecked) {
        user = customer.customer;
        if (!_.isNull(sportChecked)) {
          defer.resolve(sportChecked);
        }else {
          $http.get(CONSTANT_VARS.BACKEND_URL + '/sports/getChecked/' + user)
          .success(function(sportChecked) {
            LocalForageFactory.set(CONSTANT_VARS.LOCALFORAGE_SPORTS_CHECKED, sportChecked);
            defer.resolve(sportChecked);
          })
          .error(rejection);
        }
      }, rejection);
    return defer.promise;
  }
});

首先,将注意力集中在 setSportChecked()getSportChecked() 上,这是该服务的神奇之处,然后是函数 getSports() 调用如下所示的 getSportChecked()

          _this.getSportChecked(customer).then(function(sportChecked) {
            var sportIds = _.pluck(sports, 'id'),
                intersectedSports = _.intersection(sportIds, sportChecked.sport);
            if (sports.length) {
              sports = _.map(sports, function(sport) {
                sport.checked = !_.includes(intersectedSports, sport.id);
                return sport;
              });
            }else {
              AuthFactory.logout();
            }
          });

所以,如果这个长项目,这是最终版本,你必须接触大量文件才能完成这个,将数据保存/保存在数据库中,所以,请看这段代码,因为这是我到目前为止的方式并且工作得很好而且速度很快,我还没有错误,从这里离开,问你需要知道的问题,我会在白天回答。希望这有帮助

关于javascript - 将数据保存在数据库问题中,在控制台上收到 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28904730/

有关javascript - 将数据保存在数据库问题中,在控制台上收到 NULL的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  3. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  4. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. ruby-on-rails - rspec - 如何检查方法是否存在? - 2

    我的模型有defself.empty_building//stuffend我怎样才能对这个现有的进行rspec?,已经尝试过:describe"empty_building"dosubject{Building.new}it{shouldrespond_to:empty_building}endbutgetting:Failure/Error:it{shouldrespond_to:empty_building}expected#torespondto:empty_building 最佳答案 你有一个类方法self.empty_bu

  7. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  8. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  9. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  10. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

随机推荐