为什么节点 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”的大写
这么小的,几乎不引人注意的事情,却引起了如此多的悲伤。
希望这对某人有所帮助:)
我使用“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”的大写 这么小的,几乎不引人注意的事情,却引起了如此多的悲伤。
希望这对某人有所帮助:)