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

时间:2015-03-09 17:46:56

标签: 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", "59321H", "5932"]
code.min.js:690 ["3042", "59321H", "5932"]

我正在做post并且在post到目前为止一切正常,问题出在get,我正在使用Json网络令牌(JWT)......

这些是postget

的路线
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']
};
SetSportController.js

上的

get

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

SportSelectionService.js

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

这是FRONT-END部分

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

controller.js

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

service.js

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

那么这个错误来自哪里?我做错了什么?

1 个答案:

答案 0 :(得分:0)

下面的中间件正在检查(推测)Content-Type标头是否设置为'application / json'。由于您发送的是GET而不是POST请求,因此该标头很可能不是application / json。

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