在网址中使用文章标题,而不是ID

时间:2014-11-20 08:29:48

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

我有一个导致不同文章的链接列表。 他们看起来像这样:

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

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

但是,我认为在网址中使用id比使用文章标题更不方便用户,这就是我想要的。但我想不出一个好办法。

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

我在节点上构建了网站,有mongodb,express和angular。对于路由,我使用角度ui-router项目。

这是路由在ui.router中的外观:

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

如您所见,我在网址中使用了:id,我在post控制器中访问了该网址。

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

有没有人有这方面的经验?

2 个答案:

答案 0 :(得分:2)

我建议你使用slu .. slug是标题的URL友好版本,

标题:我的英雄帖子

Slug:/ 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

答案 1 :(得分:0)

我的建议是,如果您不能保证名称是唯一的,并且以后不会更改或编辑,请不要在网址中使用该文章的名称。

因为在这种情况下,您必须管理所有以前的名称并使用301重定向代码将它们指向正确的URL以进行搜索引擎优化,并且您还必须转换无法在URL中执行的特殊字符。 / p>

所以我认为你不想使用Mongodb为你制作的_id,你可以自己制作你的身份证明。从1开始,每次检查最后一个数字是什么,并将其增加一个