Javascript 尝试使用NODEJS检索数据时出错

Javascript 尝试使用NODEJS检索数据时出错,javascript,angularjs,node.js,Javascript,Angularjs,Node.js,我在应用程序中执行get时遇到了一个小问题 首先,这是浏览器控制台中的错误 GET http://localhost:1337/sports/getChecked/12787fb1e00a01337f0508ca47223d15 401 (Unauthorized) code.min.js:875 Object {err: "JSON request needed"} code.min.js:543 Error {stack: (...)} code.min.js:967 ["3042", "5

我在应用程序中执行
get
时遇到了一个小问题

首先,这是浏览器控制台中的错误

GET http://localhost:1337/sports/getChecked/12787fb1e00a01337f0508ca47223d15
401 (Unauthorized)
code.min.js:875 Object {err: "JSON request needed"}
code.min.js:543 Error {stack: (...)}
code.min.js:967 ["3042", "59321H", "5932"]
code.min.js:690 ["3042", "59321H", "5932"]
我正在做一个
post
,在
post
中,到目前为止一切都很好,问题在于
get
,我正在使用Json web令牌(JWT)

这些是
post
get

module.exports.routes = {
   'post /sports/checked': 'SetSportsController.setCheck',
   'get /sports/getChecked/:user': 'SetSportsController.retrieveSetCheck'
};
这里是政策

module.exports.policies = {
 setCheck: ['jwtAuth', 'sanitizerPolicy', 'headersPolicy', 'sessionKiller'],
 retrieveSetCheck: ['jwtAuth', 'sanitizerPolicy', 'sessionKiller']
};
get
onSetSportController.js

  retrieveSetCheck: function(req, res) {
    if (req.params) {
      SportSelectionService.getSportChecked(req.params).then(function(sportChecked) {
        console.log(sportChecked.sport);
        res.json(200, sportChecked);
      }, function(err) {
        res.json(400, err);
      });
    }else {
      res.json(400, {error: 'Error retrieving Sports'});
    }
  }
  getSportChecked: function(params) {
    var Promise = require('bluebird');
    return new Promise(function(fullfill, reject) {
      console.time('sportChecked_findOne');
      SportSelection.find({
        user: params.user
      }).exec(function(err, sportChecked) {
        console.timeEnd('sportChecked_findOne');
        if (err) {
          reject(new Error('Error finding favorite leagues'));
          console.error(err);
        }else {
          if (sportChecked) {
            fullfill(sportChecked.sport);
          }else {
            console.time('sportChecked_create');
            SportSelection.create({
              sport: [],
              user: params.user
            }).exec(function(err, created) {
              console.timeEnd('sportChecked_create');
              console.log(err);
              console.log(created);
              if (err) {
                reject(new Error('Error on sportChecked'));
              }else {
                fullfill(created);
                fullfill(created.sport);
              }
            });
          }
        }
      });
    });
  }
SportsFactory.getSportChecked(customer).then(function(sportChecked) {
        console.log(sportChecked);
        _.each(sports, function(sport) {
          var sportIds = _.pluck(sport, 'id'),
              intersectedSports = _.intersection(sportIds, sportChecked),
              checkedSportObjects = _.filter(sport, function(sportObj) {
                return _.includes(intersectedSports, sportObj.sportIds);
              });
          _.each(checkedSportObjects, function(sport) {
            $scope.sportObj.push(sport);
          });
        });
      });

$scope.toggleSportSelection = function(sport) {
  var params = {};
  params.user = $scope.customer.customer;
  params.sport = sport.id;
  sport.checked = !sport.checked;
  SportsFactory.setSportChecked(params);
};
  getSportChecked: function(customer) {
    var defer = $q.defer(),
        user,
        rejection = function(err) {
          console.log(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_FAVORITE_LEAGUES, sportChecked);
            defer.resolve(sportChecked);
          })
          .error(rejection);
        }
      }, rejection);
    return defer.promise;
  }
SportSelectionService.js

  retrieveSetCheck: function(req, res) {
    if (req.params) {
      SportSelectionService.getSportChecked(req.params).then(function(sportChecked) {
        console.log(sportChecked.sport);
        res.json(200, sportChecked);
      }, function(err) {
        res.json(400, err);
      });
    }else {
      res.json(400, {error: 'Error retrieving Sports'});
    }
  }
  getSportChecked: function(params) {
    var Promise = require('bluebird');
    return new Promise(function(fullfill, reject) {
      console.time('sportChecked_findOne');
      SportSelection.find({
        user: params.user
      }).exec(function(err, sportChecked) {
        console.timeEnd('sportChecked_findOne');
        if (err) {
          reject(new Error('Error finding favorite leagues'));
          console.error(err);
        }else {
          if (sportChecked) {
            fullfill(sportChecked.sport);
          }else {
            console.time('sportChecked_create');
            SportSelection.create({
              sport: [],
              user: params.user
            }).exec(function(err, created) {
              console.timeEnd('sportChecked_create');
              console.log(err);
              console.log(created);
              if (err) {
                reject(new Error('Error on sportChecked'));
              }else {
                fullfill(created);
                fullfill(created.sport);
              }
            });
          }
        }
      });
    });
  }
SportsFactory.getSportChecked(customer).then(function(sportChecked) {
        console.log(sportChecked);
        _.each(sports, function(sport) {
          var sportIds = _.pluck(sport, 'id'),
              intersectedSports = _.intersection(sportIds, sportChecked),
              checkedSportObjects = _.filter(sport, function(sportObj) {
                return _.includes(intersectedSports, sportObj.sportIds);
              });
          _.each(checkedSportObjects, function(sport) {
            $scope.sportObj.push(sport);
          });
        });
      });

$scope.toggleSportSelection = function(sport) {
  var params = {};
  params.user = $scope.customer.customer;
  params.sport = sport.id;
  sport.checked = !sport.checked;
  SportsFactory.setSportChecked(params);
};
  getSportChecked: function(customer) {
    var defer = $q.defer(),
        user,
        rejection = function(err) {
          console.log(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_FAVORITE_LEAGUES, sportChecked);
            defer.resolve(sportChecked);
          })
          .error(rejection);
        }
      }, rejection);
    return defer.promise;
  }
这是前端部分

  <ion-item ng-click="toggleSportSelection(sport)">
    {{:: sport.name}}
  </ion-item>
service.js

  retrieveSetCheck: function(req, res) {
    if (req.params) {
      SportSelectionService.getSportChecked(req.params).then(function(sportChecked) {
        console.log(sportChecked.sport);
        res.json(200, sportChecked);
      }, function(err) {
        res.json(400, err);
      });
    }else {
      res.json(400, {error: 'Error retrieving Sports'});
    }
  }
  getSportChecked: function(params) {
    var Promise = require('bluebird');
    return new Promise(function(fullfill, reject) {
      console.time('sportChecked_findOne');
      SportSelection.find({
        user: params.user
      }).exec(function(err, sportChecked) {
        console.timeEnd('sportChecked_findOne');
        if (err) {
          reject(new Error('Error finding favorite leagues'));
          console.error(err);
        }else {
          if (sportChecked) {
            fullfill(sportChecked.sport);
          }else {
            console.time('sportChecked_create');
            SportSelection.create({
              sport: [],
              user: params.user
            }).exec(function(err, created) {
              console.timeEnd('sportChecked_create');
              console.log(err);
              console.log(created);
              if (err) {
                reject(new Error('Error on sportChecked'));
              }else {
                fullfill(created);
                fullfill(created.sport);
              }
            });
          }
        }
      });
    });
  }
SportsFactory.getSportChecked(customer).then(function(sportChecked) {
        console.log(sportChecked);
        _.each(sports, function(sport) {
          var sportIds = _.pluck(sport, 'id'),
              intersectedSports = _.intersection(sportIds, sportChecked),
              checkedSportObjects = _.filter(sport, function(sportObj) {
                return _.includes(intersectedSports, sportObj.sportIds);
              });
          _.each(checkedSportObjects, function(sport) {
            $scope.sportObj.push(sport);
          });
        });
      });

$scope.toggleSportSelection = function(sport) {
  var params = {};
  params.user = $scope.customer.customer;
  params.sport = sport.id;
  sport.checked = !sport.checked;
  SportsFactory.setSportChecked(params);
};
  getSportChecked: function(customer) {
    var defer = $q.defer(),
        user,
        rejection = function(err) {
          console.log(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_FAVORITE_LEAGUES, sportChecked);
            defer.resolve(sportChecked);
          })
          .error(rejection);
        }
      }, rejection);
    return defer.promise;
  }
在文件项目中,我得到了一个名为
headersPolicy.js
的文件,看起来像这样

module.exports = function(req, res, next) {
  var _ = require('lodash');
  if (!_.isNull(req.headers)) {
    /* This API only accepts JSON, we could send 406 response, but we don't want
     * to give any kind of clues ;)
     */
    if (!req.is('json')) {
      return res.json(401, {err: 'JSON request needed'});
    }
    next();
  }else {
    /*
    * No headers, wrong request
    * */
    return res.json(401, {err: 'Headers not present'});
  }
};

那么这个错误是从哪里来的呢?我做错了什么?

下面的中间件正在检查(大概)内容类型头是否设置为“application/json”。因为您发送的是GET而不是POST请求,所以该头很可能不是application/json

    if (!req.is('json')) {
      return res.json(401, {err: 'JSON request needed'});
    }

那我怎么才能避免呢?我必须在我的代码中执行哪些更改?您需要显示如何使用这个:module.exports.policies={setCheck:['jwtAuth','sanitizerPolicy','headersPolicy','sessionKiller'],retrievessetcheck:['jwtAuth','sanitizerPolicy','sessionKiller'];我在这个应用程序中做了很多post和get,这是第一次给我这样的问题。afaik你不会在get请求中得到json,所以当方法是get
if(req.method!='get'){if(!req.is('json')){return res.json(401,{err json:'request needed'};}}时,你需要跳过这个检查。