6

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

app.all("*", doSomething);

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

谢谢!

4

5 回答 5

8

我打赌你把

app.get('/', fn)

以上

app.all("*", doSomething);

请记住,Express 将按照它们注册的顺序执行中间件函数,直到有东西发送响应

于 2013-10-10T21:41:57.073 回答
7

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

我认为问题可能是:

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
}));
于 2015-04-30T04:21:26.437 回答
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 中有什么?你确定它没有被调用吗?

于 2013-10-10T23:57:40.800 回答
1

如果你想在每个请求上运行一些代码,你不需要使用路由器。

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

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

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

希望这可以帮助

于 2013-10-10T23:52:00.897 回答
0

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

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

然而:

function doSomething(req, res, next, myOwnArgument) {
    console.log('this will never work');
}
于 2015-07-09T07:22:30.807 回答