我使用常规exp来匹配路径并将请求路由到@IBAction func doneButtonDidPress(_:)
当我请求localhost:8000 / new时,常规EXP看起来不起作用,但是我测试了EXP使用pageRouter
,它返回true。
发生了什么事?
/^\/(?!api$|api\/.*|resource$|resource\/.*)/.test('/new')
答案 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
之前定义了/resource
和pageRouter
路由器,它们就会先被触发,而不会再被pageRouter
触发。
只需在/api
之前定义/resource
和pageRouter
,然后使用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需要删除匹配的路径,所以它期望 你的比赛要在/字符开始之前停止。