我查了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(),它不起作用
由于
答案 0 :(得分:6)
exports
未定义“ globals ;”它定义了通过require
提供的模块的“ public ”成员。此外,exports
始终始终定义为exports === this
,因此(exports ? this)
实际上并未执行任何操作。
然而,由于全局变量通常不受欢迎(并且确实击败了Node的模块系统的一些意图),因此Web应用程序的一种常见方法是定义一个自定义中间件,允许访问db
作为属性req
或res
个对象:
# 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.js
的npm-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()