使用coffeescript的节点中的全局变量

时间:2012-09-17 19:07:44

标签: node.js coffeescript express

我查了How do I define global variables in CoffeeScript?  用于声明一个全局变量,即在app.js中声明并在routes / index.coffee中访问

我在app.coffee中声明(导出?this).db = redis.createClient()并尝试使用db.set('online',Date.now()访问routes.index.coffee中的db ,(错误,回复) - > console.log(reply.toString()))这似乎不起作用......发生了什么......我在节点0.8.9上

还有其他方法可以运作,但很想知道发生了什么...... 还尝试了app.coffee中的@db = redis.createClient(),它不起作用

由于

1 个答案:

答案 0 :(得分:6)

exports未定义“ globals ;”它定义了通过require提供的模块的“ public ”成员。此外,exports始终始终定义为exports === this,因此(exports ? this)实际上并未执行任何操作。

然而,由于全局变量通常不受欢迎(并且确实击败了Node的模块系统的一些意图),因此Web应用程序的一种常见方法是定义一个自定义中间件,允许访问db作为属性reqres个对象:

# app.coffee
app.use (req, res, next) ->
  req.db = redis.createClient()
  next()
# routes/index.coffee
exports.index = (req, res) ->
  req.db.set('online', Date.now(), (err,reply) -> console.log(reply))

可以在decorate.jsnpm-www npmjs.org背后的存储库中找到此示例:

function decorate (req, res, config) {
  //...

  req.model = res.model = new MC

  // ...

  req.cookies = res.cookies = new Cookies(req, res, config.keys)
  req.session = res.session = new RedSess(req, res)

  // ...

  req.couch = CouchLogin(config.registryCouch).decorate(req, res)

  // ...
}

但是,如果你仍然宁愿将db定义为全局,那么Node.JS定义了一个可以附加到的global变量:

global.db = redis.createClient()