为什么节点 Sequelize 给我一个循环引用错误?

Why is node Sequelize givng me a circular reference error?

我使用“sequelize-auto”包创建了我的数据库模型。直到今天,它一直运行良好。由于某种原因,今天早上它开始给我这个错误: ERROR: MCAIntranet.initModels is not a function 伴随着警告 (node:35036) Warning: Accessing non-existent property 'initModels' of module exports inside circular dependency

同样的函数调用 (dataqueries.getSitemap) 昨天工作正常,没有对此代码进行任何更改。由于某种原因,模型 returns 的导入 (MCAIntranet) 是一个空 JSON 数组。

这里是所有涉及的相关代码。 控制器、sequelize 查询文件、initModel 文件和 table 模型依次为:

const express = require('express');
const router = express.Router();
const Users = require('../components/Users');
const dataQuery = require('../components/dataQueries');


router.get('/', async (req, res, next) => {
    try {
        let user = await Users.getUserName(req);
        //get groups and sitemap data
        let groups = await Users.getUserRoles(user);

        // let sitemap = await dataQuery.loadFile('./data/sitemap.json', 'ascii');
       let sitemap=await dataQuery.getSitemap(); //ERROR OCCURS AT THIS LINE

        let ret = { 'userRoles': groups, 'siteMap': sitemap };
        res.send(JSON.stringify(ret));
    } catch (ex) {
        console.log("ERROR: ", ex.message);
    }
})

module.exports = router;
let sql = require('mssql');
let fs = require('fs');
// let { Connection } = require('../ConfigData/database');
const MCAIntranet = require('../configData/models/mcaintranet/init-models')
const DB = require('../ConfigData/Connector');

const runQuery = async (query, database) => {
    try {

        let pool = await Connection(database);
        let results = await pool.request().query(query);
        // console.log("Query results: ", results.recordsets[0])
        return results.recordset;
    } catch (ex) {
        // console.log("dataQueries.js 17", ex);
        return "False! ", ex;
    } finally {
        sql.close();
    }
}

const bulkInsert = async (database, table) => {
    let pool = await Connection(database);
    let insert = await pool.request()
    await insert.bulk(table, (err, result) => {
        if (err) {
            console.log("ERROR: " + err)
        } else {
            console.log("SUCCESS", result);
        }
    });
}


const loadFile = async (filePath, type) => {
    let file = fs.readFileSync(filePath, type);
    return file;
}

const writeFile = async (filePath, data) => {
    return fs.writeFile(
        filePath,
        data,
        (res) => { console.log(res) },
        () => {/* Empty callback function*/ })
}


const getSitemap = async () => {
    const sequelize = DB.GetDB(DB.MCAIntranet);
    const propsDB = MCAIntranet.initModels(sequelize); //ERROR OCCURS AT THIS LINE

    //get all values contained for user
    let props = await propsDB.tblSitemap.findAll({
        attributes: ['JSON']
    },
        { raw: true, output: true })
    let sitemap = props[0].dataValues.JSON;
    return JSON.parse(sitemap);
}

const writeSitemap = async (sitemap) => {
    const sequelize = DB.GetDB(DB.MCAIntranet);
    const propsDB = MCAIntranet.initModels(sequelize);
    propsDB.tblSitemap.update(
        {
            JSON: JSON.stringify(sitemap)
        },
        { where: { id: 1 } }
    )
}

module.exports = {
    loadFile: loadFile,
    writeFile: writeFile,
    runQuery: runQuery,
    bulkInsert: bulkInsert,
    getSitemap: getSitemap,
    writeSitemap: writeSitemap,
}
var DataTypes = require("sequelize").DataTypes;
var _tblAttendance = require("./tblAttendance");
var _tblCollectorCodes = require("./tblCollectorCodes");
var _tblCollectors = require("./tblCollectors");
var _tblContactsData = require("./tblContactsData");
var _tblEmployees = require("./tblEmployees");
var _tblExpectingData = require("./tblExpectingData");
var _tblIntranetMessage = require("./tblIntranetMessage");
var _tblLANSAAccess = require("./tblLANSAAccess");
var _tblLANSAHeadings = require("./tblLANSAHeadings");
var _tblLANSAReportHeadings = require("./tblLANSAReportHeadings");
var _tblLANSAReports = require("./tblLANSAReports");
var _tblMessageDisplay = require("./tblMessageDisplay");
var _tblPDFFiles = require("./tblPDFFiles");
var _tblPagesVisited = require("./tblPagesVisited");
var _tblPreAuth = require("./tblPreAuth");
var _tblPreAuthDebtorInfo = require("./tblPreAuthDebtorInfo");
var _tblPreAuthFlatFiles = require("./tblPreAuthFlatFiles");
var _tblRetailReports = require("./tblRetailReports");
var _tblRogersFiles = require("./tblRogersFiles");
var _tblRogersTemp1 = require("./tblRogersTemp1");
var _tblRogersWirelessPayfiles = require("./tblRogersWirelessPayfiles");
var _tblRoles = require("./tblRoles");
var _tblSMS = require("./tblSMS");
var _tblSMSSent = require("./tblSMSSent");
var _tblSMSSents = require("./tblSMSSents");
var _tblShawAccts = require("./tblShawAccts");
var _tblSickDays = require("./tblSickDays");
var _tblSiteLayout = require("./tblSiteLayout");
var _tblSiteLayoutDesks = require("./tblSiteLayoutDesks");
var _tblSiteLayoutSites = require("./tblSiteLayoutSites");
var _tblSitemap = require("./tblSitemap");
var _tblStatusAccts = require("./tblStatusAccts");
var _tblStatusUpdates = require("./tblStatusUpdates");
var _tblUDWin = require("./tblUDWin");
var _tblUserProperties = require("./tblUserProperties");
var _vwUserRoles = require("./vwUserRoles");
var _tblUserRoles = require("./tblUserRoles");
var _tblUsers = require("./tblUsers");
var _tblVacationMain = require("./tblVacationMain");
var _tblVacationRequests = require("./tblVacationRequests");
var _tblVacations = require("./tblVacations");
var _vwLoggedIn = require("./vwLoggedIn");

function initModels(sequelize) {
  var tblAttendance = _tblAttendance(sequelize, DataTypes);
  var tblCollectorCodes = _tblCollectorCodes(sequelize, DataTypes);
  var tblCollectors = _tblCollectors(sequelize, DataTypes);
  var tblContactsData = _tblContactsData(sequelize, DataTypes);
  var tblEmployees = _tblEmployees(sequelize, DataTypes);
  var tblExpectingData = _tblExpectingData(sequelize, DataTypes);
  var tblIntranetMessage = _tblIntranetMessage(sequelize, DataTypes);
  var tblLANSAAccess = _tblLANSAAccess(sequelize, DataTypes);
  var tblLANSAHeadings = _tblLANSAHeadings(sequelize, DataTypes);
  var tblLANSAReportHeadings = _tblLANSAReportHeadings(sequelize, DataTypes);
  var tblLANSAReports = _tblLANSAReports(sequelize, DataTypes);
  var tblMessageDisplay = _tblMessageDisplay(sequelize, DataTypes);
  var tblPDFFiles = _tblPDFFiles(sequelize, DataTypes);
  var tblPagesVisited = _tblPagesVisited(sequelize, DataTypes);
  var tblPreAuth = _tblPreAuth(sequelize, DataTypes);
  var tblPreAuthDebtorInfo = _tblPreAuthDebtorInfo(sequelize, DataTypes);
  var tblPreAuthFlatFiles = _tblPreAuthFlatFiles(sequelize, DataTypes);
  var tblRetailReports = _tblRetailReports(sequelize, DataTypes);
  var tblRogersFiles = _tblRogersFiles(sequelize, DataTypes);
  var tblRogersTemp1 = _tblRogersTemp1(sequelize, DataTypes);
  var tblRogersWirelessPayfiles = _tblRogersWirelessPayfiles(sequelize, DataTypes);
  var tblRoles = _tblRoles(sequelize, DataTypes);
  var tblSMS = _tblSMS(sequelize, DataTypes);
  var tblSMSSent = _tblSMSSent(sequelize, DataTypes);
  var tblSMSSents = _tblSMSSents(sequelize, DataTypes);
  var tblShawAccts = _tblShawAccts(sequelize, DataTypes);
  var tblSickDays = _tblSickDays(sequelize, DataTypes);
  var tblSiteLayout = _tblSiteLayout(sequelize, DataTypes);
  var tblSiteLayoutDesks = _tblSiteLayoutDesks(sequelize, DataTypes);
  var tblSiteLayoutSites = _tblSiteLayoutSites(sequelize, DataTypes);
  var tblSitemap = _tblSitemap(sequelize, DataTypes);  //ERROR OCCURS CALLING THIS TABLE
  var tblStatusAccts = _tblStatusAccts(sequelize, DataTypes);
  var tblStatusUpdates = _tblStatusUpdates(sequelize, DataTypes);
  var tblUDWin = _tblUDWin(sequelize, DataTypes);
  var tblUserProperties = _tblUserProperties(sequelize, DataTypes);
  var vwUserRoles = _vwUserRoles(sequelize, DataTypes);
  var tblUserRoles = _tblUserRoles(sequelize, DataTypes);
  var tblUsers = _tblUsers(sequelize, DataTypes);
  var tblVacationMain = _tblVacationMain(sequelize, DataTypes);
  var tblVacationRequests = _tblVacationRequests(sequelize, DataTypes);
  var tblVacations = _tblVacations(sequelize, DataTypes);
  var vwLoggedIn = _vwLoggedIn(sequelize, DataTypes);

  return {
    tblAttendance,
    tblCollectorCodes,
    tblCollectors,
    tblContactsData,
    tblEmployees,
    tblExpectingData,
    tblIntranetMessage,
    tblLANSAAccess,
    tblLANSAHeadings,
    tblLANSAReportHeadings,
    tblLANSAReports,
    tblMessageDisplay,
    tblPDFFiles,
    tblPagesVisited,
    tblPreAuth,
    tblPreAuthDebtorInfo,
    tblPreAuthFlatFiles,
    tblRetailReports,
    tblRogersFiles,
    tblRogersTemp1,
    tblRogersWirelessPayfiles,
    tblRoles,
    tblSMS,
    tblSMSSent,
    tblSMSSents,
    tblShawAccts,
    tblSickDays,
    tblSiteLayout,
    tblSiteLayoutDesks,
    tblSiteLayoutSites,
    tblSitemap,
    tblStatusAccts,
    tblStatusUpdates,
    tblUDWin,
    tblUserProperties,
    vwUserRoles,
    tblUserRoles,
    tblUsers,
    tblVacationMain,
    tblVacationRequests,
    tblVacations,
    vwLoggedIn,
  };
}
module.exports = initModels;
module.exports.initModels = initModels;
module.exports.default = initModels;

const sequelize = require('sequelize');
module.exports = function (sequelize, DataTypes) {
  return sequelize.define('tblSitemap', {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    JSON: {
      type: DataTypes.TEXT,
      allowNull: false
    }
  }, {
    sequelize,
    tableName: 'tblSitemap',
    schema: 'dbo',
    timestamps: false
  });
};

由于站点地图是应用程序中调用的第一个数据,并且包含所有其他组件的参考数据(延迟加载)我无法测试其他功能。

我确信我遗漏了一些小东西,但我找不到它。

原来是区分大小写的问题。即使在 Windows 环境中,Node 也对路径名区分大小写。因此在列出的第二个文件中,const MCAIntranet = require('../configData/models/mcaintranet/init-models') 应该是 const MCAIntranet = require('../ConfigData/models/mcaintranet/init-models')

注意“../ConfigData/....”中“C”的大写 这么小的,几乎不引人注意的事情,却引起了如此多的悲伤。

希望这对某人有所帮助:)