'Why is node Sequelize givng me a circular reference error?
I created a model of my database using the "sequelize-auto" package. It has worked great up until today. For some reason this morning it started giving me this error: ERROR: MCAIntranet.initModels is not a function which is accompanied by the warning (node:35036) Warning: Accessing non-existent property 'initModels' of module exports inside circular dependency
This same function call (dataqueries.getSitemap) worked fine yesterday with no changes being made to this code. The import (MCAIntranet) for the model returns an empty JSON array for some reason.
Here is all the relevant code involved. The controller, the sequelize query file, the initModel file and the table model in order:
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
});
};
As the sitemap is the first data called in the application, and contains reference data for all other components (lazy loading) I am unable to test other functions.
I am sure that I am missing something small but I can't spot it.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
