我正在使用nodejs和ejs模板。我想设置一个只在页面加载时调用的中间件,而不是在我从代码发送请求时调用。
示例:
app.use(function(req, res, next){
if(req.session){
console.log("OKAY");
}
next();
});
我希望此日志仅在页面加载时出现,而不是在我从以下代码发送请求时
$.get( "/users", function( data ) {
console.log(data);
});
我该怎么做?
谢谢
答案 0 :(得分:3)
您有几个选择:
在您的中间件中,您可以检查req.path,看看它是否应该应用中间件,并在您的middlware中使用if
调用next()
而不做任何事情或做任何中间件的设计。
您可以设计到该页面的路由路由和ajax路由在不同的路径上,然后为页面路由设计路由器,为ajax路由设计路由器,并将中间件仅设置在页面路由器上。
如果您设计了网址,那么它将对您提供很多帮助(使用上述任一选项),以便您的服务器轻松区分这是否应该应用或不应用中间件的网址。通常,最简单的方法是在URL设计的一个或两个分支上使用已知前缀。例如,所有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路由和另一个模块中的所有页面路由,每个路由都会导出自己的路由器。
答案 1 :(得分:0)
我使用JQuery从客户端发送请求,我从jfriend00链接看到req.xhr返回一个布尔属性,如果请求的X-Requested-With标头字段是“ XMLHttpRequest“,表示请求是由客户端库(如jQuery)发出的。
ignoredProperties()
谢谢你jfriend00