私は 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
これでできるすばらしいことについては、モジュールを参照してください。
これが役に立てば幸いです!