expressjs,使用常规exp来匹配路由

时间:2017-08-30 07:52:26

标签: node.js express

我使用常规exp来匹配路径并将请求路由到@IBAction func doneButtonDidPress(_:) 当我请求localhost:8000 / new时,常规EXP看起来不起作用,但是我测试了EXP使用pageRouter,它返回true。
发生了什么事?

/^\/(?!api$|api\/.*|resource$|resource\/.*)/.test('/new')

3 个答案:

答案 0 :(得分:0)

在这种情况下,您只需使用regexp代替wildcard

const express = require('express'); const app = express()

app.get('/api', function(req, res){ res.send('API·Router') })
app.get('/resource', function(req, res){ res.send('RESOURCE·Router') })
app.get('/*', function(req, res){ res.send('[*] PAGE.Router') })

app.listen(3000)

在通配符之前定义所有其他路线很重要'/*'

为什么?:如果您的第一条路线是通配符,它​​会捕获所有请求

使用通配符检测路径

app.get('/*', function (req, res) {
 var paths = req.path.split("/")
 if(paths[1].length==0){
  res.send('[/] Page.Root')
 }else if(paths[1]=='portal'){
  if(paths[2]){ res.send('[*] PAGE.Router : '+paths[2]) }
  else{ res.send('[*] PAGE.Router : '+paths[1]) }
 }else{ res.send('[404] PATH : '+paths[1]+' not found!') }
});

使用数组:

如果你有一个特定的路由列表,你想要用于pageRouter,你总是可以将它们分组到一个数组中,作为app.get()处理程序的第一个参数:

const pageRoutes = ['en/page','es/pagina','dk/side','jp/頁']
app.get(pageRoutes, function(req, res){ res.send('[*] PAGE.Router') })

答案 1 :(得分:0)

OP似乎试图通过正则表达式排除/api/resource pageRouter。但是,它不是必需的。只要在/api之前定义了/resourcepageRouter路由器,它们就会先被触发,而不会再被pageRouter触发。

只需在/api之前定义/resourcepageRouter,然后使用router.use('/', pageRouter);,以便除/api和{{1}之外的所有网址将由/resource收听。

以下是示例代码。我已经验证并确认对pageRouter的HTTP请求不会通过/resource

文件:

pageRouter

./app.js ./routes.js ./pageRouter.js ./resourceRouter.js

./app.js

const express = require('express'); const app = express(); const routes = require('./routes'); app.use('/', routes); app.listen(3000, function () { console.log('Example app listening on port 3000!') });

./routes.js

var express = require('express'); var router = express.Router(); const resourceRouter = require('./resourceRouter'); const pageRouter = require('./pageRouter'); router.use('/resource',resourceRouter); router.use('/', pageRouter); module.exports = router;

./resourceRouter.js

var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) { res.send('respond with resource'); }); module.exports = router;

./pageRouter.js

运行var express = require('express'); var router = express.Router(); router.get('/resource', function(req, res, next) { console.log('hit /resource in pageRouter'); res.send('respond with page by /resource'); }); router.get('/new-page', function(req, res, next) { res.send('respond with page by /new-page'); }); router.get('*', function(req, res, next) { console.log('hit * in pageRouter'); res.send('respond with page by *'); }); module.exports = router; 后,对./app.js的HTTP GET请求永远不会/resource

答案 2 :(得分:0)

我从expressjs的github得到了答案,链接是https://github.com/expressjs/express/issues/3404

  

这不仅仅是正则表达式匹配的问题   输入,但是因为.use需要删除匹配的路径,所以它期望   你的比赛要在/字符开始之前停止。