Nodejs:仅用于页面加载的中间件

我正在使用nodejs和ejs模板。 我想设置一个中间件,只有在页面加载的时候才会调用,而不是从代码发送请求。

例:

app.use(function(req, res, next){ if(req.session){ console.log("OKAY"); } next(); }); 

我希望这个日志只出现在页面加载,而不是当我发送像下面的代码请求

 $.get( "/users", function( data ) { console.log(data); }); 

我怎样才能做到这一点 ?

谢谢

你有几个select:

  1. 在你的中间件中,你可以检查req.path来查看是否应该使用中间件的path,并在你的中间件中使用if来调用next()而不做任何事情或者执行中间件的devise去做。

  2. 你可以devise你的路由到那个页面路由和ajax路由在不同的path上,然后为页面路由devise一个路由器,为ajax路由devise一个路由器,并把中间件放在页面路由器上。

如果你devise你的url,它会真的帮你很多(上面的任一选项),这样你的服务器很容易区分这是一个应该还是不应该使用中间件的URL。 通常,最简单的方法是在URLdevise的一个或两个分支上使用已知的前缀。 例如,所有的ajax URL都可以以/api开头,然后你可以很容易地将所有的API调用分离到一个特殊的路由器,而所有其他的URL都是非API的URL(可能是页面的URL)。

这是一个单独的API路由器的例子:

 // split off all API calls to a separate router let apiRouter = express.Router(); app.use('/api', apiRouter); // handle /api/users apiRouter.get('/users', handleUserAjaxRequest); // handle all other /api/xxx routes that don't have their own handler apiRouter.use(function(req, res, next) { // if /api request not handled by here, then don't allow it to propagate further // it must be a invalid /api/xxx URL, so do a 404 res.status(404).end(); }); // this won't get called if there's a /api/xxx URL because that will have // already been handled by the apiRouter app.use(someMiddleware); app.get('/somepage', handleSomePageURL); 

你也可以使用一个单独的路由器来处理所有的页面请求,这可能会使得模块性更清晰一个模块中的所有API路由和另一个模块中的所有页面路由,每个路由都导出自己的路由器。

我使用JQuery发送来自客户端的请求,我从jfriend00的链接看到req.xhr返回一个布尔属性,如果请求的X-Requested-With头域是“XMLHttpRequest”,则返回true,表明请求是由客户端库,如jQuery。

 app.use(function(req, res, next){ if(req.xhr){ console.log("FROM CLIENT LIBRARY"); } next(); }); 

谢谢你jfriend00