我正在尝试访问所需节点文件中的变量。但是,需要它的文件总是在不等待设置变量的情况下继续。如何在继续之前让app.coffee等待?
我有两个文件:
db.coffee:
databaseUrl = 'mongodb://localhost/db'
mongoose = require('mongoose')
mongoose.connect(databaseUrl)
db = mongoose.connection
records = []
db.on('error', console.error.bind(console, 'connection error:'))
db.once('open', () ->
console.log('Connected to database: ', databaseUrl)
)
schema = new mongoose.Schema({play_counts: {type: Number}, album_name: {type: String }})
albums = mongoose.model('albums', schema)
albums.find({}, {}, (err, data) ->
if err?
console.log("Error: failure to retrieve albums.")
return
else
records = data
)
console.log(records)
module.export = records
和app.coffee:
db = require('./db')
console.log(db)
当我运行app.coffee时,我从app中的控制台日志获得[]的输出,然后是db.coffee的输出,即使是require调用。
在继续操作之前,让应用程序等待数据库完成的最佳方法是什么,这样我就可以访问db.coffee中的记录变量了。谢谢你的帮助。
答案 0 :(得分:1)
从某种意义上说,db.coffee
已经完成了。该文件中的所有代码都已执行。
只是你想要的,records
还没有,因为负责获取它的函数,albums.find
接受第三个参数(err, data)
,这是一个函数,它被调用很久以后当猫鼬实际上在数据库中找到了你的记录。这是一个磁盘操作,所以这就是Nodejs的异步特性所在,因为它使你能够“继续”并继续执行其他事情,而mongoose正在获取所述数据。
所以实际上,你不想依赖db.coffee
完成,你真正想要等待的是你的albums.find
函数调用你传递它作为第三个参数的回调 - (err, data)
从 albums
而不是记录中导出db.coffee
本身会更有意义。
albums = mongoose.model('albums', schema)
module.export = albums;
然后在您的 app.coffee
中,您可以执行抓取/查找记录:
albums = require('./db')
albums.find({}, {}, (err, data) ->
if err?
console.log("Error: failure to retrieve albums.")
return
else
console.log(records)
);