3

各ページ リクエストのリクエスト ヘッダーを確認する必要があります。これを試す場所は「apostrophe-express」モジュールになると思いました。「apostrophe-express」を拡張する独自のモジュール「auth」を作成しました。

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 が存在しない場合は、ユーザーを別のサイトにリダイレクトします)。

ありがとう!

4

1 に答える 1

5

私は P'unk Avenue の Apostrophe の主任設計者です。

apostrophe-expressモジュールを新しい名前で拡張したくありません。そのモジュールはapos.appシングルトンを提供するため、新しい名前で拡張すると 2 回セットアップされるだけでapos.app、混乱や潜在的な問題が発生します。

すべての Express リクエストをインターセプトする

代わりに、モジュールのmiddlewareオプションを活用してください。apostrophe-expressあなたはそれを行うことができます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 が適切な Web ページを作成して送信しようとしているリクエストのみを具体的に必要とする可能性があります。

そのために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 が Web ページ全体を応答としてレンダリングするが、Apostrophe のページ ツリーに対応するページ オブジェクトがない場合がいくつかあるためです。

ページ オブジェクトがロードされた直後のインターセプト

もう 1 つのオプション: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.pageまたは のいずれかreq.data.bestPageが存在することを許可していることに注意してください。URL がページと正確に一致しない場合、アポストロフィはreq.data.bestPage、URL に一致する最も長い「パス プレフィックス」を持つページに設定されます。たとえば、URL が /foo/bar で、/foo は存在するが /foo/bar が存在しない場合は、req.data.bestPageになります/foo。これはreq.data.bestPage最悪の場合、ホームページになることに注意してください。

apostrophe-custom-pagesこれでできるすばらしいことについては、モジュールを参照してください。

これが役に立てば幸いです!

于 2016-10-01T13:51:53.100 に答える