我正在尝试使用我的节点项目中的所有控制器都可以访问的变量。目前在一个控制器中我有:
var ua = req.headers['user-agent'];
var isMobile = "no";
if(/mobile/i.test(ua))
isMobile="yes";
将所有这些复制到所有控制器并将isMobile变量传递给视图是没有意义的。我想将isMobile的值设置一次,然后将它从我的控制器传递到任何地方。
有没有一种简单的方法可以做到这一点而不是在每个控制器中粘贴这4行代码复制?
由于
答案 0 :(得分:1)
您需要使用Sails 策略:
// /api/policies/isMobile.js
module.exports = function(req, res, next) {
var ua = req.headers['user-agent'];
req.isMobile = /mobile/i.test(ua);
next();
}
// /config/policies.js
module.exports.policies = {
'*': 'isMobile'
};
这将在每个控制器操作之前运行代码,并允许您访问所有自定义控制器代码中的req.isMobile var。
答案 1 :(得分:0)
真正的全局变量并不是特别的选项,因为高于1的任何并发都可能导致意外行为。由于它是独特请求本身特有的东西,req
对象可能是您最好的选择。
假设您可以在任何想要使用此标志的地方访问req
对象,您可以在任何时候向req
对象添加属性(最好在请求的早期/响应周期)。添加此属性后,它应该可以访问req
。
req.isMobile = /mobile/i.test(req.headers['user-agent']) ? 'yes' : 'no';
或者,如果有明确的风帆中间件等概念
function isMobile(req, res, next) {
req.isMobile = /mobile/i.test(req.headers['user-agent']) ? 'yes' : 'no';
next();
}