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

时间:2017-09-05 23:54:11

标签: javascript node.js express

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

示例:

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

我希望此日志仅在页面加载时出现,而不是在我从以下代码发送请求时

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

我该怎么做?

谢谢

2 个答案:

答案 0 :(得分:3)

您有几个选择:

  1. 在您的中间件中,您可以检查req.path,看看它是否应该应用中间件,并在您的middlware中使用if调用next()而不做任何事情或做任何中间件的设计。

  2. 您可以设计到该页面的路由路由和ajax路由在不同的路径上,然后为页面路由设计路由器,为ajax路由设计路由器,并将中间件仅设置在页面路由器上。

  3. 如果您设计了网址,那么它将对您提供很多帮助(使用上述任一选项),以便您的服务器轻松区分这是否应该应用或不应用中间件的网址。通常,最简单的方法是在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