我需要检查每个页面请求的请求标头。我认为尝试这个的地方将是'撇号 - 快递'模块。我创建了自己的模块'auth',扩展了'撇号 - 快递':
module.exports = {
extend: 'apostrophe-express',
name: 'auth',
alias: 'auth',
absoluteUrl: function(req, res, next){
console.log(req);
}
};
但这不起作用。我收到错误'撇号 - 模板\ index.js“597 req.browserCall('apos.pageReadywhenCalm($(”body“));')'
您能否告诉我应该在每个页面请求中挂钩以运行某些自定义检查/规则(例如,如果某个cookie不存在,那么将用户重定向到其他站点)?
谢谢!
答案 0 :(得分:3)
我是P'unk Avenue的Apostrophe的主要设计师。
您不希望以新名称扩展apostrophe-express
模块。该模块提供apos.app
单例,因此以新名称扩展它只会设置apos.app
两次,从而导致混淆和潜在问题。
相反,只需利用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
};
};
您指定了“每个网页请求”,我将其解释为“每个网页请求”。但是你有可能只想要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.page
或req.data.bestPage
。如果URL与页面不完全匹配,Apostrophe会将req.data.bestPage
设置为与URL匹配的最长“路径前缀”的页面。例如,如果URL为/ foo / bar且/ foo存在但/ foo / bar不存在,则req.data.bestPage
将为/foo
。请注意,这意味着req.data.bestPage
将成为最糟糕情况下的主页。
请参阅apostrophe-custom-pages
模块,了解您可以使用此功能完成的事情。
希望这有用!