Node.js module.exports 没有导出整个对象
Node.js module.exports not exporting the whole object
我正在尝试将 sequelizejs 与 express 结合使用。模型被组织到多个目录中。
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 调用时模型未定义。我已经验证了上面的 db 对象并且模型是成功需要的但没有导出到 require 调用。
app.js
var models = require('./sequelize_init.js');
models.User.findAll().then(); // Throws undefined error
您的模型在设置 module.exports
很久之后异步导入、关联等,因此当您在模块末尾合并它时 db
仍然是一个空对象。
对此的一种解决方案是改为导出一个初始化函数,该函数接受一个回调,一旦所有初始化步骤完成,该回调就会被调用。例如:
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();
});
我正在尝试将 sequelizejs 与 express 结合使用。模型被组织到多个目录中。
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 调用时模型未定义。我已经验证了上面的 db 对象并且模型是成功需要的但没有导出到 require 调用。
app.js
var models = require('./sequelize_init.js');
models.User.findAll().then(); // Throws undefined error
您的模型在设置 module.exports
很久之后异步导入、关联等,因此当您在模块末尾合并它时 db
仍然是一个空对象。
对此的一种解决方案是改为导出一个初始化函数,该函数接受一个回调,一旦所有初始化步骤完成,该回调就会被调用。例如:
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();
});