【问题标题】:How do I require something from index.js in the same directory?如何在同一目录中要求 index.js 中的某些内容?
【发布时间】:2017-07-07 16:33:24
【问题描述】:

我有以下文件结构:

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 使其不是未定义的?

【问题讨论】:

  • const { neededStuff } = require('./index'); 肯定可以工作。
  • index.js 中记录db!将console.log(db); 放在module.exports = db; 之前!它记录了什么?
  • console.log(Object.keys(db)); 日志[ 'Something', 'User', 'sequelize', 'Sequelize' ]
  • 不管怎样,db 内部的 something.js 对象需要什么?

标签: javascript node.js sequelize.js


【解决方案1】:
const neededStuff = require('./'); // the best

或:

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

或:

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

【讨论】:

  • 在所有这些情况下它都是一个空对象
  • @mrowa44 我刚刚测试过它,它正在工作!发布更多代码!
【解决方案2】:

原来这是一个循环依赖。 index.js 正在从 something.js 导入东西,然后我尝试在 something.js 中导入 index.js

如果模块 A 在完成导出设置之前需要('B'),然后模块 B 需要('A'),它将返回一个空对象,而不是 A 可能打算导出的对象。

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

但是你可以在sequelize.models.Something sequelize 中使用来自另一个模型的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多