node.js 继续执行而不等待 require 完成。

node.js continues execution without waiting for a require to complete.

我正在尝试访问所需节点文件中的变量。然而,需要它的文件总是继续而不等待变量被设置。如何让 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 我从控制台登录应用程序得到 [] 的输出,然后是 db.coffee 的输出,即使 require 调用也是如此。

让应用程序等待数据库完成后再继续的最佳方法是什么,这样我就可以访问 db.coffee 中的记录变量。感谢您的帮助。

某种意义上db.coffee已经完成了。该文件中的所有代码都已执行。

只是你想要的records还没有,因为负责获取它的函数albums.find需要第三个参数(err, data),这是一个函数和当猫鼬实际上在数据库中找到您的记录时,它会在很久以后被调用。这是一个磁盘操作,因此这就是 Nodejs 的异步特性大放异彩的地方,因为它使您能够 "move on" 并在 mongoose 获取所述数据的同时继续执行其他事情。

所以实际上,你不想依赖 db.coffee 完成,你真正想要等待的是你的 albums.find 函数调用你作为第三个传递给它的回调参数 - (err, data)

从您的 db.coffee 而不是记录中导出 albums 本身更有意义。

albums = mongoose.model('albums', schema)
module.export = albums;

然后在您的 app.coffee 中,您将执行 fetching/finding 记录:

albums = require('./db')
albums.find({}, {}, (err, data) ->
    if err?
        console.log("Error: failure to retrieve albums.")
        return
    else
        console.log(records)
);