Node.js Express - 访问根域时不会调用app.all(“*”,func)

时间:2013-10-10 21:40:03

标签: javascript node.js express

我正在尝试设置一个在每个页面加载时调用的全局函数,无论它在我的网站中的位置如何。根据Express的API,我使用了

app.all("*", doSomething);

在每个页面加载时调用doSomething函数,但它并不完全有效。该函数会在每个页面加载时触发,除了基本域的页面加载(例如http://domain.com/pageA将调用该函数,但http://domain.com将不会)。有谁知道我做错了什么?

谢谢!

5 个答案:

答案 0 :(得分:5)

我知道这是一个旧的,但仍然可能对某人有用。

我认为问题可能是:

app.use(express.static(path.join(__dirname, 'public')));

var router = express.Router();

router.use(function (req, res, next) {
    console.log("middleware");
    next();
});

router.get('/', function(req, res) {
    console.log('root');
});
router.get('/anything', function(req, res) {
   console.log('any other path');
});

在任何路径上调用的中间件,/

这是因为express.static默认在public/index.html

上提供/

要解决此问题,请将参数添加到静态中间件:

app.use(express.static(path.join(__dirname, 'public'), {
    index: false
}));

答案 1 :(得分:3)

我打赌你放了

app.get('/', fn)

以上

app.all("*", doSomething);

请记住,Express会按照注册顺序执行中间件功能,直到某些内容发送响应为止

答案 2 :(得分:1)

如果您想在每个请求上运行一些代码,则无需使用路由器。

只需将中间件放在路由器上方,每次请求都会调用它:

app.use(function(req, res, next){
  //whatever you put here will be executed
  //on each request

  next();  // BE SURE TO CALL next() !!
});

希望这有帮助

答案 3 :(得分:1)

链中的app.all('*')在哪里?如果它在所有其他路由之后,则可能不会被调用。

app.post("/something",function(req,res,next){ ...dothings.... res.send(200); });

app.all('*',function(req,res) { ...this NEVER gets called. No next and res already sent });

除非你打算将它放在最后,否则你必须确保在前面的路线中调用next()。例如:

app.post("/something",function(req,res,next){ ...dothings.... next();});

app.all('*',function(req,res) { ...this gets called });

另外,doSomething中有什么?你确定它没有被调用吗?

答案 4 :(得分:0)

我也有这个问题,我发现你的doSomething函数的参数数量可能是一个因素。

function doSomething(req, res, next) {
    console.log('this will work');
}

,而:

function doSomething(req, res, next, myOwnArgument) {
    console.log('this will never work');
}