【问题标题】:express regular expression string notation表达正则表达式字符串表示法
【发布时间】:2014-09-05 12:08:11
【问题描述】:

我是 Javascript 和正则表达式的新手,所以我有点卡在如何使路由匹配以 /user/.... 开头的所有 url

我可以app.get(/user/, function(req,req){ /*stuff*/});

但我想知道如果我使用字符串代替正则表达式对象,我该怎么做。例如

app.get("/user/:id", function(req,req){ /*stuff*/});  

仅匹配带有"user" 和一个参数的网址。我将如何对其进行编码使其匹配"user" 和 N 个参数

还有使用字符串或文字 javascript regex 对象之间的区别是什么? 我发现即使在字符串表示法中我也可以做这样的事情......

app.get("/user/:d([a-z]*)", function (req, res) {

    //more stuff
});

【问题讨论】:

  • get 不能那样工作...另外,如果您想使用动态字符串作为正则表达式,请使用 RegExp 构造函数
  • @AmitJoki 你是什么意思get 不能那样工作...我使用的教程传递了一个字符串作为get 方法的正则表达式参数
  • 使用字符串和正则表达式的区别在于,任何正则表达式捕获组只能通过索引访问,而字符串形式支持“命名捕获组”。
  • @mscdex 是唯一的区别吗?我记得在某处读到使用正则表达式文字可以为您提供比仅使用字符串更多的功能

标签: javascript regex node.js express


【解决方案1】:

我不确定传递单个路由 N 参数的方法。但是,您可以执行一些不同的路线,例如:

var userController = requrie('./user_controller'),
  isAuthenticated = require('./middleware/is_authenticated');

app.get("/user/:id/address/:addressId", userController.addressById);
app.get("/user/:id/address", userController.address);
app.get("/user/:id", userController.index);

为了在执行控制器操作之前检查身份验证之类的内容,您可以为此使用中间件并将其作为第二个参数放在控制器操作之前,如下所示:

app.get("/user/:id", isAuthenticated, userController.index);

在上面的示例中,您的 user_controller.js 看起来像这样:

module.exports = {
  index: function(req, res) {
    // index action logic
  },
  address: function(req, res) {
    // address action logic
  },
  addressById: function(req, res) {
    // addressById action logic
  }
};

这将允许您将相似但不同的路由传递给不同的控制器操作,这将使您能够更好地控制如何整理不同的路由,因为无论如何这更多的是路由器的工作而不是控制器的工作。

还有一点需要注意的是路线的顺序很重要。通常最好将一组路由中更具体的路由放在最前面,将更通用的路由放在最后。

希望有帮助!

【讨论】:

  • 如果我希望每个/user/... 调用都通过一个通用路由(以检查用户是否仍然登录),那么将其作为第一条路由是有意义的,对吗?
  • 啊哈,我知道你想做什么了。我不确定是否有办法检查身份验证,但这篇博客文章很好地解释了如何在特定路由上通过中间件进行路由,这可能对你有用。 scotch.io/quick-tips/js/node/…
  • 在我的通用/user/... 中我只是输入了if(!req.session.uname) redirect("/login"); 这是一种检查用户是否登录的方法吗?
  • 通常你会在用户机器上存储一些会话变量和一个cookie,它们需要以某种方式组合以检查它们是否真的经过身份验证。但是,是的,只要您在他们登录时将他们的用户名存储在 req.session.uname 中,这或多或少都会起作用。另外,您需要res.redirect("/login");(使用redirect 对象上的redirect 方法. 在旁注中,我强烈建议您研究更强大的身份验证,而不仅仅是检查会话变量。
  • 哦,是的,我的意思是res.redirect。谢谢您的帮助!但是我可以使用哪些其他形式的身份验证?你说的是passportjs之类的东西吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2019-04-17
  • 2022-01-25
  • 1970-01-01
  • 2013-12-15
  • 2016-01-24
相关资源
最近更新 更多