2

我检查了这个如何在 CoffeeScript 中定义全局变量? 用于声明全局变量,即在 app.js 中声明并在 routes/index.coffee 中访问

我在 app.coffee 中声明 (exports ? this).db = redis.createClient() 并尝试使用 db.set('online',Date.now(), (err ,reply) -> console.log(reply.toString()) ) 这似乎不起作用......发生了什么......我在节点 0.8.9

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

谢谢

4

1 回答 1

6

exports没有定义“全局”;它定义了模块的“公共”成员,可通过require. 此外,exports最初总是定义和exports === this,因此(exports ? this)实际上并没有做任何事情。

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

# 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))

可以在npmjs.org后面的存储库decorate.js中找到一个示例:npm-www

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为全局global变量,Node.JS 定义了一个您可以附加到的变量:

global.db = redis.createClient()
于 2012-09-17T20:24:44.107 回答