正则路由处理程序中的正则表达式覆盖默认路由

时间:2014-12-09 01:57:40

标签: regex node.js express

var express = require('express');
var tracker = require('../lib/pixel-track')
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res) {
  res.render('index', { title: 'index' });
});

router.get(/^\/(([0-9a-zA-Z\._-])+.(gif|GIF))$/, tracker.requestHandler);

module.exports = router;

所以我有这个快递路由器。根据我的逻辑,第二个语句匹配任何对`/whatever.gif的请求,第一个语句仅用于/。出于某种原因,请求/仍然发送gif。关于正则表达式路由处理程序如何接管我的索引路由处理程序,我有点困惑。

有趣的是,我在/ api位置有完全相同的正则表达式路由和跟踪器代码,它工作正常,而不是覆盖索引。另外,如果我注释掉router.get(' /' ...路由,它仍然显示localhost:4000

的像素

1 个答案:

答案 0 :(得分:1)

我不直接使用路由器模块。不知道你用这种方式瞄准的是什么?

你也不需要这么复杂的正则表达式:

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

/* GET home page. */
app.get('/', function(req, res) {
    console.log("got /");
    res.end("/");
});

app.get(/^\/[\w-.]+\.gif$/i, function(req, res) {
    console.log("got gif");
    res.end("a gif!");
});

app.listen(8000);

<强>更新

最好的我可以告诉,原因是它没有在你的代码中处理你的原始路由,因为在你的repo中,api var(索引文件的路径)是var api = require('./routes/api/index');而你的索引是设置的在indexRoute中你并没有在任何地方使用它。请记住,在路由中,app.use中定义的路径被视为基本路径,因此:

假设你的app.js中有这个:

var indexRoute = require('./routes/index');
var api = require('./routes/api/index');
app.use('/', indexRoute);
app.use('/api', api);

这些路线处理程序:

// /routes/api/index.js
router.get('/', function(req, res) {
    res.send('You called api route /');
});

// /routes/index.js
router.get('/', function(req, res) {
    res.send('You called index route /');
});
router.get(/^\/[\w-.]+\.gif$/i, function(req, res) {
    res.end("a gif!");
});

这似乎对我有用(尽管app.use(express.static(path.join(__dirname, 'public')));阻止了/路线!)。