【问题标题】:Use an articles title in the url, not the id在 url 中使用文章标题,而不是 id
【发布时间】:2015-01-18 00:55:46
【问题描述】:

我有一个指向不同文章的链接列表。 它们看起来像这样:

<a ui-sref="post-view({ id: post._id })">...</a>

他们会产生这样的href:href="/blog/546cb8af0c0ec394d7fbfdbf",这是它应该做的。当我点击链接时,我会转到id为546cb8af0c0ec394d7fbfdbf的相关文章。

但是,我认为在 url 中使用 id 比使用文章标题更不友好,这正是我想要的。但是我想不出一个好的方法。

由于文章标题不一定是唯一的,我不知道如何根据标题从数据库中获取正确的文章(这是不可能的,我需要一些唯一的东西来查找它)。

我已经在节点上构建了站点,使用 mongodb、express 和 angular。对于路由,我使用 angular ui-router 项目。

这是路由在 ui.router 中的样子:

.state('post-view', {
    url: '/blog/:id',
    templateUrl: '/post',
    controller: 'post'
})

如您所见,我在 url 中使用 :id,我在 post 控制器中访问它。

如果我应该在同一页面上显示文章,作为当前活动状态的子状态,我可以从父状态继承 id,但是由于这会导致一个新页面,所以我不会确定我能做什么。

有人有这方面的经验吗?

【问题讨论】:

  • 也许这个Q & A也能给你一些提示..
  • 不错,浏览了一下。会仔细看看。

标签: javascript angularjs node.js mongodb angular-ui-router


【解决方案1】:

我建议你使用蛞蝓。 slug 是标题的 URL 友好版本,

标题:我的英雄帖子

蛞蝓:/my-hero-post

WordPress 广告的示例,当它从标题创建一个 slug 时会进行一些替换:

文档:wp_unique_post_slug

Source code

您需要做的是将标题中的å/ 等字符替换为URL 友好的内容,并用- 替换空格,然后在创建时将其保存为帖子对象中的唯一键帖子。您也可以查看 ghost 源代码作为示例:

https://github.com/TryGhost/Ghost/blob/d44a97405bbe58730f3c397f504634a504d3e6e9/core/server/models/base.js#L322

这个 NPM 包实际上为你完成了大部分工作:slugify

【讨论】:

  • 我正在考虑 Wordpress 实际执行此操作的方式,但出于某种原因,我认为我会在标题和 ID 之间进行某种映射。我不知道为什么我不认为蛞蝓,我知道 Wordpress 使用它们。谢谢,等我有时间再看看!
  • 它有帮助 :) 如果有相同的 slug,我想我可以在 slug 的末尾添加一个数字。
  • 这也是 WordPress 和 Ghost 实际所做的 :)
  • 我同意 Jonathan M. Hethey 的观点,即蛞蝓是一个很好的解决方案。但是由于这个 slug 是对标题的改进——我猜它是 可更改的——你最终会得到一个在标题更新时需要更新的标识符。也许您甚至会将此标识符用作其他文档中的参考。如果此标识符不是不可变的,则您必须更改所有引用以及对标题/slug 的可能更改。如果数据分布在多个集合中,这可能需要几个非原子操作。只是需要考虑的一些事情 =)
  • 关于相同蛞蝓可能出现的问题...您可以按您所说的添加一个数字,或者只是拒绝标题导致已被使用的蛞蝓的新文章。要么让 Mongo 使用唯一索引来处理这个问题,要么在客户端检查唯一性。
【解决方案2】:

如果你不能保证文章的名字是唯一的并且以后不会改变或被编辑,我的建议是不要在url中使用文章的名字。

因为在这种情况下,您必须管理所有以前的名称,并使用 301 重定向代码将它们指向正确的 url 以用于 SEO 目的,您还必须转换无法在 URL 中执行的特殊字符。

所以我认为你不想使用 Mongodb 为你制作的 _id,你可以自己制作你的 id。从 1 开始,每次检查最后一个数字是多少,然后加一

【讨论】:

  • 这样 ids 将是一个数字,例如45?嗯,我会考虑的。它可能看起来更好一点,但如果有标题就好了。也许我必须改变一些更根本的东西。
  • 我不建议将_id 设置为递增数字除非您有充分的理由这样做。 MongoDB 缺乏内置的自增功能,因此每次需要新数字时,您都必须在数据库中手动 set up a counter collectionfindAndModify。这绝不是不可能的,但需要一点额外的工作。 UID(或基本上是 ObjecId...)更容易,不需要记忆。
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 2016-11-25
  • 2017-04-01
  • 2014-11-20
  • 2015-01-31
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
相关资源
最近更新 更多