Node.js module.exports不导出整个对象

我试图用express来使用sequelizejs 。 模型被组织成多个目录。

Users(directory)

 users.js profile.js ... 

Articles

 article.js comments.js ... 

我已经修改了sequelize-express示例来遍历子目录,并使用promises导入模型。

sequelize_init.js

 'use strict'; var fs = require('fs'), path = require('path'), _ = require('lodash'), config = require('./auth-config'), Sequelize = require('sequelize'), glob = require('glob'), Q = require('q'), db = {}; var sequelize; function getGlobbedModels() { var deferred = Q.defer(); glob('./config/sequelize/models/**/*.js', function(err, files) { if(err) deferred.reject('Glob Error' + err); else deferred.resolve(files); }); return deferred.promise; } function importModels(models){ var deferred = Q.defer(); for (var i = models.length - 1; i >= 0; i--) { if(!i) { deferred.resolve('Successfully Required'); } var model = sequelize.import(path.resolve(models[i])); db[model.name] = model; } return deferred.promise; } function associateModels(resp) { var deferred = Q.defer(); var models = Object.keys(db); for (var i = models.length - 1; i >= 0; i--) { if(!i) { deferred.resolve(); } if(db[models[i]].options.hasOwnProperty('associate')) { db[models[i]].options.associate(db); } } return deferred.promise; } function synchronize() { // Synchronizing any model changes with database. sequelize .sync({ force: process.env.FORCE_DB_SYNC }) .then(function () { console.info('Database synchronized'); }).catch(function (err) { console.error('An error occurred: ', err); }); } if(process.env.NODE_ENV === 'PRODUCTION') { //Use production DB }else { //Use local DB sequelize = new Sequelize(...); } getGlobbedModels() .then(importModels) .fail(function(err){ console.error('importModels err ' + err); }) .then(associateModels) .fail(function(err){ console.error('associateModels err' + err); }) .then(synchronize) .fail(function(err){ console.error('synchronize err' + err); }); // assign the sequelize variables to the db object and returning the db. module.exports = _.extend({ sequelize: sequelize, Sequelize: Sequelize }, db); 

而在我的app.js文件中,我需要下面的代码,但是导出到require调用时模型是未定义的。 我已经validation了上面的db对象,并且模型已经成功地被需要,但是不会被导出到require调用。

app.js

 var models = require('./sequelize_init.js'); models.User.findAll().then(); // Throws undefined error 

您的模型是在module.exports被设置好之后被asynchronous导入,关联等的,因此当您在模块的末尾合并db它仍然是一个空对象。

解决这个问题的方法之一是导出一个初始化函数,该函数接受一个完成初始化步骤后调用的callback函数。 例如:

sequelize_init.js

 // ... module.exports = function(cb) { getGlobbedModels() .then(importModels) .fail(cb) .then(associateModels) .fail(cb) .then(synchronize) .fail(cb) .then(function() { cb(null, _.extend({ sequelize: sequelize, Sequelize: Sequelize }, db)); }); }; 

app.js

 var init = require('./sequelize_init.js'); init(function(err, models) { if (err) throw err; models.User.findAll().then(); });