使用干净的字符串URL而不是使用带有ui-router的mongo对象id的url

时间:2015-12-07 21:29:08

标签: angularjs mongodb mongoose angular-ui-router

我想使用像:

这样的风格

http:// mysite / performer_ratings / guitar-players

而不是网址中的典型mongo ID:

http:// mysite / performer_ratings / 56623de898tt752ae45

我正在使用角度ui-router成功使用ui-srefs来创建,并加载我想要的模板。

  

我的问题是我无法弄清楚如何从请求中获取格式化名称并使用它来检索我需要的主题对象。 (顺便说一句,我使用名为“topic_url”的属性来存储“吉他手”而不是“吉他手”这个名称)

我可以通过以下方式让应用程序使用丑陋的URL:

//view controller
$http.get('api/topics/' + $stateParams.id).success(function(topic){
  $scope.topic = topic;}

// api/topic/topic.controller
// Get a single topic
exports.show = function(req, res) {
 Topic.findById(req.params.id, function (err, topic) {
  if(err) { return handleError(res, err); }
  if(!topic) { return res.status(404).send('Not Found'); }
  return res.json(topic);
 });
};

但我不能这样做:

//view
// Get a single topic
exports.show = function(req, res) {
 $http.get('api/topics/' + $stateParams.topic_url).success(function(topic){
  $scope.topic = topic;
 });
};



//in api/topic/topic.controller
exports.show = function(req, res){
 Topic.findOne({topic_url: req.params.topic_url}, function(err, topic){
  if(err) { return handleError(res, err); }
  if(!topic) { return res.status(404).send('Not Found'); }
  return res.status(200).json(topic);
 });
};

我无法很好地了解req对象,知道如何访问它的内容,谷歌搜索并没有帮助我...这可能是解决我问题的简单方法。

我想要在我的网址中使用名称类型属性的替代方法而不是对象ID

提前致谢。

1 个答案:

答案 0 :(得分:2)

通过反复试验,我找到了让我的节目请求与“更漂亮”的参数一起工作的方法。

关键是使用:req.params.id而不是req.params.user_url

即使我的ui-router设置如下:

  .state('performer_rating', {
    url: '^/performer_rating/:topic_url',
    templateUrl: 'app/topic/performer_rating.html',
    controller: 'PerformerRatingCtrl'
  });

和我的html创建http:// mysite / performer_ratings / guitar-players样式网址是这样的:

 <li class="topic-pills" ng-repeat="rating_topic in list_topics" ng-  class="{active: isActive('{{rating_topic.topic_url}}') }">
    <a ui-sref="performer_rating({topic_url:rating_topic.topic_url})">{{rating_topic.title}}</a>
 </li>

我想mongoose在最后的“/”之后获取url的部分,并将它分配给params.id,即使我在调用它:$ stateProvider配置中的topic_url?

我认为现在我已经弄明白了。视图控制器确实使用:topic_url,但无论如何,api控制器都会调用最后一部分“.id”。 (它也很有趣,它是.id,而不是._id ...用对象访问id所需的下划线)

我似乎也保留了带有条件if(req.params.id)的REST api的功能?这不总是真的吗?即使我搞砸了它:

// Get a single topic
exports.show = function(req, res) {
  if(req.params.id){
// handles pretty urls
    Topic.findOne({topic_url: req.params.id}, function(err, topic){
      if(err) { return handleError(res, err); }
      if(!topic) { return res.status(404).send('Not Found'); }
      return res.status(200).json(topic);
})
  }else{
    Topic.findById(req.params.id, function (err, topic) {
      if(err) { return handleError(res, err); }
      if(!topic) { return res.status(404).send('Not Found'); }
      return res.status(200).json(topic);
    });
  }
};

!我仍然喜欢别人的反馈,知道是否有更好的“angularjs方式”来实现我的网址风格目标。