2017-02-18 93 views
2

我有以下文件结构:如何从index.js中获取相同目录中的内容?

models/ 
    index.js 
    something.js 
    user.js 

index.js(这是由Sequalize产生,从这里进口的东西,在其他目录工作):

'use strict'; 

var fs  = require('fs'); 
var path  = require('path'); 
var Sequelize = require('sequelize'); 
var basename = path.basename(module.filename); 
var env  = process.env.NODE_ENV || 'development'; 
var config = require(__dirname + '/../config/config')[env]; 
var db  = {}; 

if (config.use_env_variable) { 
    var sequelize = new Sequelize(process.env[config.use_env_variable]); 
} else { 
    var sequelize = new Sequelize(config.database, config.username, config.password, config); 
} 

fs 
    .readdirSync(__dirname) 
    .filter(function(file) { 
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); 
    }) 
    .forEach(function(file) { 
    var model = sequelize['import'](path.join(__dirname, file)); 
    db[model.name] = model; 
    }); 

Object.keys(db).forEach(function(modelName) { 
    if (db[modelName].associate) { 
    db[modelName].associate(db); 
    } 
}); 

db.sequelize = sequelize; 
db.Sequelize = Sequelize; 

module.exports = db; // <<< I want to import that in something.js 

user.js

'use strict'; 

module.exports = (sequelize, DataTypes) => { 
    const User = sequelize.define('User', { 
    username: { type: DataTypes.STRING, allowNull: false, unique: true }, 
    password: { type: DataTypes.STRING, allowNull: false }, 
    }, { 
    classMethods: { 
     associate() {}, 
    }, 
    }); 

    return User; 
}; 

something.js

'use strict'; 

// this all logs an empty object 
console.log(require('./index')); 
console.log(require('.')); 
console.log(require('./')); 
console.log(require('../models')); 
console.log(require('../models/')); 
console.log(require('../models/index')); 

module.exports = (sequelize, DataTypes) => { 
    const Something = sequelize.define('Something', { 
    name: DataTypes.STRING, 
    }, { 
    classMethods: { 
     associate(models) { 
     }, 
    }, 
    }); 
    return Something; 
}; 

如果我需要db从其他目录中的文件它的作品,所以我想这不是一个导出问题。

如何在something.js中要求db因此它不是未定义的?

+0

'const {neededStuff} = require('./ index');'当然可以。 –

+0

在'index.js'中记录'db'!把'console.log(db);'放在'module.exports = db;'之前!它记录了什么? –

+0

'console.log(Object.keys(db));'logs' ['Something','User','sequelize','Sequelize']' – mrowa44

回答

1

原来这是一个循环依赖关系。 index.js是从something.js导入的东西,然后我尝试导入index.jssomething.js

如果模块A需要(“B”)之前,它已经完成设立它的出口,则模块B需要(“A”),它会回来,而不是什么一个可能打算导出空对象。

http://selfcontained.us/2012/05/08/node-js-circular-dependencies/

但是你可以在sequelize使用方法从另一个模型sequelize.models.Something

2
const neededStuff = require('./'); // the best 

或:

const neededStuff = require('./index'); 

或:

const neededStuff = require('../models/'); 
+0

在所有这些情况下,它都是一个空对象 – mrowa44

+1

@ mrowa44我刚刚测试过它,它工作正常!发布更多代码! –