node.js - 在 url 路径开头的参数的快速路由器排序
问题描述
我正在使用 express,我希望我的用户个人资料 URL 如下所示:example.com/:username
但是,我仍然需要其他 URL,例如 example.com/login 和 example.com/view/:id
如果我这样订购路由器,当请求发送到 example.com/login 时,它会将“login”视为用户名:
router.get('/:username', function (req, res, next) {
res.render('profile', {data: req.params.username});
})
router.get('/login', function (req, res, next) {
res.render('login', {data: null});
})
router.get('/view/:id', function (req, res, next) {
res.render('view', {data: req.params.id});
})
如果我把 /:username 路由器放在最后,一切正常。但是,如果有人访问 example.com/view(没有 id),我需要它发送一个错误,即视图控制器没有收到 id。相反,它再次将其视为用户名,而是发送用户名不存在的错误。
解决这个问题的最干净的方法是什么?我只需要为所有基本 url 路径添加一个路由器吗?(像这样):
router.get('/login', function (req, res, next) {
res.render('login', {data: null});
})
router.get('/view/:id', function (req, res, next) {
res.render('view', {data: req.params.id});
})
router.get('/view', function (req, res, next) {
res.render('viewError', {data: null});
})
router.get('/:username', function (req, res, next) {
res.render('profile', {data: req.params.username});
})
解决方案
我不完全确定这是否是正确的方法,但是这听起来像是我可能会遇到的事情,我希望通过这种方法解决它,直到找到更好的解决方案。
下面的解决方案对路径格式使用单一路由/:value
,无论是登录名、视图还是任何用户名,因此您可以输入一个简单的 if-else-if 或 switch 以将控制权交给相应的控制器,或者只是从中渲染一个视图。这样,必须处理的顺序根本无关紧要。
router.get("/:username", function(req, res, next) {
if (req.params.username === "login") {
res.render("login", { data: null });
} else if (req.params.username === "view") {
res.render("viewError", { data: null });
} else {
res.render("profile", { data: req.params.username });
}
});
router.get("/view/:id", function(req, res, next) {
res.render("view", { data: req.params.id });
});
推荐阅读
- google-analytics - Google Analytics BigQuery 导出事件计数问题
- react-admin - React Admin:如何将状态传递给转换
- javascript - Angular JS中带有自定义文本的选择框中的预设选项
- python - 如何调整numpy数组的大小?
- kubernetes - Kubernetes kubectl 补丁 pod 与删除/创建 pod
- swift - 快速比较三个枚举
- python - Python pivot_table - 添加差异列
- c - 如何使用 write() 或 fwrite() 将数据写入终端(stdout)?
- powershell - 将从文件中读取的变量传递给调用命令
- r - 尽管在常规 R 脚本中工作,但命令无法在 RMarkdown 中运行