【问题标题】:Error in routing with id parameter, link works but displays no data使用 id 参数路由时出错,链接有效但不显示数据
【发布时间】:2016-07-21 20:41:56
【问题描述】:

我在通过 :id 参数检索存储的数据(在 MongoDB 中)时遇到问题。该链接有效,并将我带到指定的 url (./contests/1),但数据未显示。在使用 (db.contests.find( {id:1} )) 在 mongo CMD 中查询时,正确的对象数据会正确显示。

路由/contest.js

router.route("/contests/:id")
  .get(function(req, res, next) {
     Contest.findOne({id: req.params.id}, function(err, contest) {
      if(err) {
        res.send(err);
      }
      res.json(contest);
  });

服务/contestService.js

  app.factory("contestService", ["$http", "$resource",
  function($http, $resource)
  {
    var o = {
      contests: []
    };

    function getAll() {
      return $http.get("/contests").then(function(res) {
        angular.copy(res.data, o.contests);
      });
    }

    function get(id) {
      return $resource('/contests/:id');
    }

    o.getAll = getAll;
    o.get = get;

    return o;
  }]);
})();

控制器/contestController.js

var app = angular.module("sportsApp.controllers.contest,["ui.router"]);

  app.config(["$stateProvider", function($stateProvider) {
    $stateProvider.state("contest", {
      parent: "root",
      url: "/contests/:id",
      views: {
        "container@": {
          templateUrl: "partials/contests",
          controller: "ContestController"
        }
      }
    });
  }
]);

app.controller("ContestController", ["$scope","contestService", "$stateParams", function($scope, contestService, $stateParams) {
  var contest_id = $stateParams.id;
  $scope.contest = contestService.get({id: contest_id});
}]);
})();

竞赛架构

var mongoose = require("mongoose");

var ContestSchema = new mongoose.Schema(
  {
    id: Number,
    tags: String,
    matchups: [{
      type: mongoose.Schema.Types.ObjectId,
      ref: "Matchup"
    }],
    usersWhoJoined: [{
      type: mongoose.Schema.Types.ObjectId,
      ref: "User"
    }]
  });



mongoose.model("Contest", ContestSchema);

任何帮助或建议将不胜感激,因为我正在学习 MEAN 堆栈并且几乎没有经验。


我希望显示特定比赛的对决,其中显示两支球队和其他变量。这是我 mongo 导入的 json 文件,以便在 MongoDB 中创建比赛集合的对象:

    {
    "id": 1,
    "tags": "NBA",
    "matchups": [{
        "matchupId": 1,
        "selectedTeam": "",
        "matchupWinner": "Atlanta",
        "nbaTeams": [{
            "team": "Portland",
            "logo": "stylesheets/nbalogos/Portland-Trail-Blazers-Logo.png"
        }, {
            "team": "Atlanta",
            "logo": "stylesheets/nbalogos/atl-hawks.png"
        }]
    }, {
        "matchupId": 2,
        "selectedTeam": "",
        "matchupWinner": "Dallas",
        "nbaTeams": [{
            "team": "Dallas",
            "logo": "stylesheets/nbalogos/Dallas-Mavericks.png"
        }, {
            "team": "Detroit",
            "logo": "stylesheets/nbalogos/DET.png"
        }]
    }, {
        "matchupId": 3,
        "selectedTeam": "",
        "matchupWinner": "Golden State",
        "nbaTeams": [{
            "team": "Golden State",
            "logo": "stylesheets/nbalogos/GSW.png"
        }, {
            "team": "Memphis",
            "logo": "stylesheets/nbalogos/Memphis-Grizzlies.png"
        }]
    }, {
        "matchupId": 4,
        "selectedTeam": "",
        "matchupWinner": "Oklahoma City",
        "nbaTeams": [{
            "team": "Oklahoma City",
            "logo": "stylesheets/nbalogos/OKC-Thunder.png"
        }, {
            "team": "Pheonix",
            "logo": "stylesheets/nbalogos/Pheonix-Suns.jpg"
        }]
    }, {
        "matchupId": 5,
        "selectedTeam": "",
        "matchupWinner": "Utah",
        "nbaTeams": [{
            "team": "Sacremento",
            "logo": "stylesheets/nbalogos/Sacremento-Kings.jpg"
        }, {
            "team": "Utah",
            "logo": "stylesheets/nbalogos/Utah-Jazz.jpg"
        }]
    }]
}

我想以这种格式创建每场比赛。

【问题讨论】:

  • 不确定整个错误,这可能不相关,因为您在 Postman 中看到了错误,但是 Angular 服务/资源不像 Express 那样工作。您需要手动将 id 与您的 url 连接起来,例如:return $resource('/contests/' + id);
  • 我对代码进行了更改,不幸的是它与 Postman 错误无关。但是,这对我未来在项目中的路线很有帮助。感谢您的回复。
  • 您确定 Contest 配置正确,并且 Mongo 正在 Express 中运行吗?
  • 是的,我确定,但我错了。您的建议确实消除了 Postman 错误,因此非常感谢您。现在,另一个快速的问题,当我尝试使用语法显示任何比赛信息时,{{比赛.id}}或任何其他变量什么都没有显示。还是得到一张空桌子。我的教授要求我上传我的架构,所以我编辑了我的帖子。
  • contestService.get 期待什么类型的变量?当你分配$scope.contest 时,你用什么类型的变量调用它?

标签: angularjs express mongoose mean-stack ngresource


【解决方案1】:

我不知道实际数据与这个问题有什么相关性,所以让我们从$scope.contest 开始,因为您访问数据的方式似乎存在问题。

// ContestController
$scope.contest = contestService.get({id: contest_id});

好的,所以您正在使用一个对象调用contestService.get 方法,假设它是{id: 2}。让我们看看那个方法并用那个对象调用它。

// contestService
function get(id) {
    return $resource('/contests/' + id);
}

如果使用我们的虚拟数据,如果您调用 get({id: 2}),您现在在 URL /contests/[object Object] 处拥有一个 Angular 资源,因为您的对象 gets converted into a string。如果使用该对象的 id 属性中的值调用您的方法,则该方法将起作用,例如:

// ContestController
$scope.contest = contestService.get(contest_id);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2012-08-13
    • 2016-02-23
    • 2016-05-23
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多