我正在尝试拥有一个可以被我的节点项目中的所有控制器访问的变量。目前在一个控制器中,我有:
var ua = req.headers['user-agent'];
var isMobile = "no";
if(/mobile/i.test(ua))
isMobile="yes";
复制我所有控制器的所有这些并将 isMobile 变量传递给视图是没有意义的。我想获取一次 isMobile 的值设置,然后将其从我的控制器传递到我想要的任何位置。
有没有一种简单的方法可以做到这一点,而不是将这 4 行代码副本粘贴到每个控制器中?
谢谢
为此使用 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 的并发都可能导致意外行为。由于它是唯一请求本身所特有的,因此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();
}