2017-08-30 35 views
0

我使用常規exp來匹配路徑並將請求路由到pageRouter
當我請求本地主機:8000 /新,經常EXP看起來不起作用,但我已經測試EXP使用/^\/(?!api$|api\/.*|resource$|resource\/.*)/.test('/new'),它返回true。
發生了什麼?expressjs,使用常規exp來匹配路由

router.use('/api',apiRouter); 
router.use('/resource',resourceRouter); 
router.use(/^\/(?!api$|api\/.*|resource$|resource\/.*)/,pageRouter); 

pageRouter.get("*",(req,resp,next)=>{let name = req.originalUrl...}) 
+0

看來你試圖通過正則表達式來排除'/ api'和'/ resource'。你不需要。由於'/ api'和'/ resource'路由器是在pageRouter之前定義的,它們將首先被觸發,而不是被pageRouter內部定義的路由器。只需使用'router.use('/',pageRouter);',這樣除了'/ api'和'/ resource'之外的所有URL都將被pageRouter監聽。 – shaochuancs

+0

這將導致:/資源..將首先通過資源路由器,然後通過pageRouter.But我只想通過資源路由器/資源。 – sinbar

+0

真的嗎?請檢查我的答案。 – shaochuancs

回答

0

我從expressjs的github上一個答案,鏈接https://github.com/expressjs/express/issues/3404

這是不是隻是一個做正則表達式匹配 輸入此事,但因爲。使用需要剝離下來匹配的路徑,它預計 你的匹配在一個/字符切斷之前停止。

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的路由列表,您始終可以將它們組合到數組中作爲的第一個參數()處理:

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

+0

我測試了 router.use('/ api',apiRouter); router.use('/ resource',resourceRouter); router.use('/:page',pageRouter); 這是不行的,因爲/ api ..將首先通過apiRoute,然後通過/ pageRoute – sinbar

+0

@sinbar /:頁面不是我告訴你在這個答案中做的。如果使用通配符,則檢查/拆分req路徑,而不是查看通配符路徑/ *中的請求。 – EMX

0

看來OP正試圖通過正則表達式來排除pageRouter/api/resource。但是,這不是必需的。只要/api/resource路由器在pageRouter之前定義,它們將首先被觸發,並且不會再通過pageRouter

pageRouter之前只要定義/api/resource,然後用router.use('/', pageRouter);,所以,除了/api/resource所有URL將被pageRouter被傾聽。

以下是示例代碼。我已驗證並確認對/resource的HTTP請求不會經過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絕不會打./pageRouter.js

+0

你的快遞版本是什麼? 我測試你的代碼沒有任何變化,瀏覽器顯示:「用資源迴應」和控制檯日誌「hit * in pageRouter」,它表明通過resourceRouter和pageRouter – sinbar

+0

My Express版本的請求是4.13.4,I在WebStorm內運行應用程序(應該與從cli運行相同) – shaochuancs