【问题标题】:Check headers on each page request检查每个页面请求的标题
【发布时间】:2016-10-01 21:51:53
【问题描述】:

我需要检查每个页面请求的请求标头。我认为尝试这个的地方是'撇号-快递'模块。我创建了自己的模块 'auth',它扩展了 'apostrophe-express':

module.exports = {
extend: 'apostrophe-express',
name: 'auth',
alias: 'auth',
absoluteUrl: function(req, res, next){
    console.log(req);
 }
};

但这不起作用。我收到错误 'apostrophe-templates\index.js" 597 req.browserCall('apos.pageReadywhenCalm($("body"));')'

你能告诉我应该在哪里挂钩每个页面请求以运行一些自定义检查/规则(例如,如果某个 cookie 不存在,则将用户重定向到不同的站点)?

谢谢!

【问题讨论】:

    标签: apostrophe-cms


    【解决方案1】:

    我是 P'unk Avenue 的 Apostrophe 的主要建筑师。

    您不想以新名称扩展 apostrophe-express 模块。该模块提供 apos.app 单例,因此以新名称扩展它只会设置 apos.app 两次,从而导致混淆和潜在问题。

    拦截每个 Express 请求

    相反,只需利用apostrophe-express 模块的middleware 选项。你可以在app.js

    var apos = require('apostrophe')({
      modules: {
        // Other module configuration here, then ...
        'apostrophe-express': {
          middleware: [
            function(req, res, next) {
              // Do whatever you like here
              console.log(req.url);
              // Let the request continue. You could also
              // use res.redirect, res.send, etc. and
              // bypass Apostrophe, in which case you
              // should NOT call next
              return next();
            }
          ]
        }
      }
    });
    

    这就是您所需要的,您可以使用require 从另一个文件中提取中间件功能,从而减少app.js 中的混乱。但是值得指出的是,您可以将此代码移动到项目中的 lib/modules/apostrophe-express/index.js 文件中,以“隐式子类化”该模块。这也为提供您自己的 construct 属性打开了大门,这将允许您根据需要覆盖模块的任何方法。

    如果你以这种方式接近它,你根本不需要触摸app.js

    // in lib/modules/apostrophe-express/index.js at project level
    module.exports = {
      middleware: [
        function(req, res, next) {
          console.log(req.url);
          return next();
        }
      ],
      construct: function(self, options) {
        // If you want, override methods of the module here   
      };
    };
    

    在页面渲染前拦截请求

    您指定了“每个页面请求”,我将其解释为“每个 Web 请求”。但是您可能只需要 Apostrophe 即将构建和发送正确网页的请求。

    为此,只需将pageBeforeSend 方法添加到您自己的任何模块即可。假设我们的模块名为cool-stuff

    // in app.js
    
    var apos = require('apostrophe')({
      modules: {
        // Other module configuration here, then ...
       'cool-stuff': {}
      }
    });
    
    
    // In lib/modules/cool-stuff/index.js
    
    module.exports = {
      construct: function(self, options) {
        self.pageBeforeSend = function(req, callback) {
          // Careful, there isn't always a page object; we could be
          // rendering /login for instance
          console.log(req.data.page && req.data.page._url);
          return callback(null);
        };
      }
    };
    

    撇号总是为每个具有这种方法的模块调用pageBeforeSend

    如上所示,注意不要假设设置了req.data.page,因为在少数情况下,Apostrophe 会呈现完整的网页作为响应,但 Apostrophe 的页面树中没有相应的页面对象。

    在页面对象加载后立即拦截

    另一种选择:如果pageBeforeSend 对您来说太晚了,例如因为您希望小部件加载器看到您对req 所做的更改,请改用pageServe...

    // in app.js
    
    var apos = require('apostrophe')({
      modules: {
        // Other module configuration here, then ...
       'cool-stuff': {}
      }
    });
    
    // lib/modules/cool-stuff/index.js
    
    module.exports = {
      construct: function(self, options) {
        self.pageServe = function(req, callback) {
          // Express request URL
          console.log(req.url);
          // URL of the best matching page available
          console.log((req.data.page || req.data.bestPage)._url);
          return callback(null);
        };
      }
    };
    

    请注意,我允许 req.data.pagereq.data.bestPage 存在。如果 URL 与页面不完全匹配,Apostrophe 会将 req.data.bestPage 设置为与 URL 匹配的“路径前缀”最长的页面。例如,如果 URL 是 /foo/bar 并且 /foo 存在但 /foo/bar 不存在,则 req.data.bestPage 将是 /foo。请注意,这意味着req.data.bestPage 将是最坏情况下的主页。

    请参阅apostrophe-custom-pages 模块,了解您可以用它做的巧妙事情。

    希望对您有所帮助!

    【讨论】:

    • 现在这是一个全面的答案!感谢您提供了几种不同的方法来做到这一点。我选择了选项 2(项目级别)。这是“未cookie”的情况。如果 cookie 存在,我想自动将用户添加到 Apos 用户(aposUsersSafe 集合),然后将用户自动登录到 Apos。这两个都可行吗?我相信可以通过扩展护照来完成自动登录:apostrophecms.org/docs/modules/apostrophe-login/index.html。这是尝试这样做的正确方法吗?虽然不确定自动添加用户。可以做到吗?再次感谢您的精彩回答!
    • 这些问题也很好!您介意将它们单独发布在 SO 上,以便其他人更容易找到答案吗?谢谢!
    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 2012-10-12
    • 2014-05-31
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多