2017-02-18 92 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我剛剛測試過它,它工作正常!發佈更多代碼! –