这是我的路线情况。我已经在处理静态网站(渲染网站)的路线,如
domain.com/:id
domain.com/john-and-anna
domain.com/something-different
现在我正在考虑创建id为
的路由sign-in
ID必须是唯一的,用户会选择它,因此我可以在mongodb中创建一个集合并将id设置为唯一。
问题在于,我认为Express Router将处理cookie-policy
和sign-in
作为ID。因此,我需要以不同的方式处理它们 - 每次检查用户是否未将其ID设置为cookie-policy
或domain.com/string/:id
(或其他页面)并且它仍然是唯一的。有点乱。
我可以通过设置新路线来解决所有这些问题
grep ^U myfile.csv
但这不是我想要的第一个目标。
有没有办法以更好的方式处理这个问题?先感谢您。
答案 0 :(得分:2)
您可以尝试在app.get("/sign-in");
之前设置app.get("/cookie-policy");
和app.get("/:id");
。
Express将按照定义的顺序处理路线。这不会100%有效,因为我现在无法测试它,但你可以尝试一下!
编辑:最好的办法是创建一个处理程序/:id,然后检查:id是登录还是cookie-policy,并从其他ID中处理它们。
答案 1 :(得分:2)
domain.com/:id
通常是一个坏主意,除非你有一个简单的规则允许你区分id和非id(例如id只有数字而non-id永远不是数字)。但是,如果您允许用户选择自己的ID并且不强制执行一些严格的规则来让您从字符串中识别出什么是id并且不是id,那么您真的不应该{{1}因为这很容易与你所有其他顶级资源混淆。
当domain.com/:id
做出{1}}会更好,因为在请求身份证时它是100%明显的,当它是其他内容时,身份证明可以毫无疑问地成为用户想要的任何内容它(在URL中允许)。想要在您的网站上添加更多页面时,请考虑现在和未来,这样您就不会在请求ID的请求与请求其他资源之间存在歧义。
如果您真的想让用户拥有domain.com/id/:id
,那么您必须将所有其他静态资源放在他们自己的子路径中,例如domain.com/theirchoicehere
和{{1并禁止用户选择domain.com/sys/login
之类的内容,以便在ID和您的网站网址之间不会发生冲突。这里的要点是用户选择的路径名和用于管理网站的名称需要位于单独的命名空间中(不在相同的路径位置)。所以,如果你想要其中一个在顶层,那么决定哪一个在顶层并强制另一个到第二层。
路由按顺序匹配,因此您可以在以后添加更具体的路由和不太具体的路由(其中包含domain.com/sys/logout
的路由),但您仍需要仔细设计路径结构,这样就没有了模糊度。
答案 2 :(得分:0)
快速匹配订单中的传入路由,如果您希望其他路由工作,则应将domain.com/:id
路由处理程序放在最后:
domain.com/john-and-anna
domain.com/something-different
domain.com/:id