Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 快速路由处理程序中的正则表达式覆盖默认路由_Regex_Node.js_Express - Fatal编程技术网

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

Regex 快速路由处理程序中的正则表达式覆盖默认路由,regex,node.js,express,Regex,Node.js,Express,所以我有一个快速路由器。根据我的逻辑,第二条语句将任何请求与`/whater.gif匹配,第一条语句仅用于/。出于某种原因,请求在/处仍然发送gif。对于正则表达式路由处理程序如何接管我的索引路由处理程序,我有点困惑 有趣的是,我在a/api位置有完全相同的正则表达式路由和跟踪器代码,它工作正常,不覆盖索引。另外,如果我注释掉router.get(“/”…route,它仍然在localhost:4000上显示像素。我不想直接使用路由器模块。不确定这样使用它的目的是什么 您也不需要如此复杂的正则表

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


有趣的是,我在a/api位置有完全相同的正则表达式路由和跟踪器代码,它工作正常,不覆盖索引。另外,如果我注释掉router.get(“/”…route,它仍然在localhost:4000上显示像素。我不想直接使用路由器模块。不确定这样使用它的目的是什么

您也不需要如此复杂的正则表达式:

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;
更新

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

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

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);
这些路由处理程序:

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

这似乎对我有效(尽管
app.use(express.static(path.join(\uu dirname,'public')));
阻止了
/
路由!)。

我将其移动到路由器中,因为我最初在路由器app.use之后将其放在应用中(“/”…声明。我想知道传输到路由器是否会改变它。而且,这是我写的第一个正则表达式哈哈,我需要从gif请求中获得一条信息,所以我需要一些(()但是正则表达式的复杂性会影响路由吗?我不确定这是否能回答这个问题。那个路由器只是应用程序的一个文件。我只是不明白为什么这个路由会超过我之前出现的默认路由。我想知道为什么/request不提供索引。我今天到家后会跟进并尝试使用它在。我还用一个app.get在路线之外尝试了它(…正如你所展示的,所以我不认为简单地将它从路由器实例切换到应用实例就能解决它。这可能是一个实际的错误吗?PS:代码是否缺少依赖项和破坏性错误?我更新到了新版本的express,仍然不会在请求时加载/路由。我正在使用nodemon在ubuntu和osx上尝试这一点。它所做的一切如果在/or/anything.gif上加载像素,我无法获取要渲染的索引。我想我会进一步挖掘。我不知道为什么它对你有效,而对我自己无效。哦,我没有将我的npm包放入repo中。但我一开始的观点是,如果我转到/anything.gif,它将加载一个像素。idk为什么你的有错误,但如果我转到/,它应该res.render(index,{title:index});,但它给了我一个像素。这在我的第一篇文章中不是很明显吗?
// /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!");
});