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

Posted

技术标签:

【中文标题】使用干净的字符串 url,而不是使用带有 ui-router 的 mongo 对象 id 的 url【英文标题】:Using clean string urls instead of urls with mongo object ids with ui-router 【发布时间】:2016-03-12 15:31:01 【问题描述】:

我想使用如下样式:

http://mysite/performer_ratings/guitar-players

而不是url中的典型mongo id:

http://mysite/performer_ratings/56623de898tt752ae45

我正在使用 Angular ui-router 成功地使用 ui-srefs 创建任何一个,并加载我想要的模板。

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

我 - 可以 - 让应用程序使用以下丑陋的网址:

//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 对象以了解如何访问它的内容,并且谷歌搜索并没有帮助我。这可能是解决我问题的简单方法。

我正在寻找在我的 url 中使用名称类型属性而不是对象 ID 的替代方法

提前致谢。

【问题讨论】:

【参考方案1】:

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

密钥使用的是: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 风格的 url 是这样的:

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

我猜猫鼬会在最后一个“/”之后获取 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 方式”来实现我的 url 样式目标。

【讨论】:

以上是关于使用干净的字符串 url,而不是使用带有 ui-router 的 mongo 对象 id 的 url的主要内容,如果未能解决你的问题,请参考以下文章

如何使用htaccess文件创建干净的URL

ReactJS- 在带有 React 路由器的 URL 中使用 slug 而不是 Id

Django URLs - 如何通过干净的 URLs 传递项目列表?

带有查询字符串的 Laravel 路由 url

在视图而不是模板中生成带有 Django 静态 url 的图像标签

条件绑定的初始化程序必须具有可选类型,而不是“字符串”在干净构建后不起作用