【问题标题】:Global variable across all controllers in Node JSNode JS中所有控制器的全局变量
【发布时间】:2014-02-20 06:12:14
【问题描述】:

我正在尝试让我的节点项目中的所有控制器都可以访问一个变量。目前在一个控制器中我有:

        var ua = req.headers['user-agent'];
        var isMobile = "no";
        if(/mobile/i.test(ua))
            isMobile="yes";

为我的所有控制器复制所有这些并将 isMobile 变量传递给视图是没有意义的。我想一次性获取 isMobile 的值,然后将它从我的控制器传递到我想要的任何地方。

有没有一种简单的方法可以做到这一点,而不是将这 4 行代码复制粘贴到每个控制器中?

谢谢

【问题讨论】:

  • 你在用 expressjs 吗?
  • 不,我使用的是sails.js

标签: node.js global-variables user-agent sails.js controllers


【解决方案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 username = 'whatev' 用于连接到 shopify 的 api,但它对我不起作用。关于如何调试它的任何提示?
【解决方案2】:

真正的全局变量并不是特别好的选择,因为任何高于 1 的并发都可能导致意外行为。由于它是独特的请求本身所特有的,req 对象可能是您最好的选择。

假设您可以在任何想要使用此标志的地方访问req 对象,您可以在任何时候(最好在请求/响应周期的早期)简单地将属性添加到req 对象。添加此属性后,它应该在任何可以访问req 的地方都可用。

  req.isMobile = /mobile/i.test(req.headers['user-agent']) ? 'yes' : 'no'; 

或者如果在 express forsails 中有类似中间件的概念

 function isMobile(req, res, next) {
   req.isMobile = /mobile/i.test(req.headers['user-agent']) ? 'yes' : 'no'; 
   next();
 }

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多