创build一个javascript对象并绑定这个

我正在尝试构build我的第一个节点应用程序。 我的app.js文件如下所示。 我想通过执行'app = require('app')'来访问其他模块。 然后我想访问app.app,app.dbConn和app.models

问题是,当我需要这个模块,app.models是不存在的结果对象。

var express = require('express'); var path = require('path'); var orm = require('orm'); var settings = require('./config/settings'); var mainRouter = require('./config/routes'); var environment = require('./config/environment'); var db = require('./config/db'); var auth = require('./modules/auth'); module.exports = new function(){ this.app = express(); // middlewares must be added in order - start with the basics environment(this.app); if (process.env.TESTING) { dbSettings = settings.dbTesting; } else { dbSettings = settings.db; } // add models to the request early in the middleware chain this.dbConn = orm.connect(dbSettings, function(err){ if (err) return console.error('DB Connection error: ' + err); else{ this.models = db.init(this.dbConn); this.app.use(function(req,res,next){ req.models = this.models; next(); }); passport = auth.init(this.models); authRouter = auth.router(passport) this.app.use('/users', authRouter); this.app.use(mainRouter); } }.bind(this)); this.app.listen(settings.port); console.log('Server started... listening on port ' + settings.port) } 

实现我所需要的唯一方法是使用一个需要callback的函数,最后我重写了我的代码:

 var express = require('express'); var path = require('path'); var orm = require('orm'); var settings = require('./config/settings'); var mainRouter = require('./config/routes'); var environment = require('./config/environment'); var db = require('./config/db'); var auth = require('./modules/auth'); var app; module.exports = function(cb){ app = express(); // middlewares must be added in order - start with the basics environment(app); if (process.env.TESTING) { dbSettings = settings.dbTesting; } else { dbSettings = settings.db; } // add models to the request early in the middleware chain dbConn = orm.connect(dbSettings, function(err){ if (err) return console.error('DB Connection error: ' + err); else{ models = db.init(dbConn); app.use(function(req,res,next){ req.models = models; next(); }); passport = auth.init(this.models); authRouter = auth.router(passport) app.use('/users', authRouter); app.use(mainRouter); cb({ dbConn: dbConn, app: app, models: models }); } }); } if (!process.env.TESTING) { module.exports(function(server){ server.app.listen(settings.port); console.log('Server started... listening on port ' + settings.port) }); } 

只有在数据库连接完成app.models定义app.models :在需要模块后不能马上使用它。 您应该提供一个入口点,接受一个连接准备就绪的函数,然后在orm.connectcallback中调用这个函数。

即使“服务器启动”消息有点误导,因为在服务器实际上可以执行任何操作之前 ,因为传递给orm.connect的函数还没有被调用。

app.models从来没有定义,所以它永远不可用。

相反,尝试

 app.set('models', db.init(this.dbConn);