希望有人能指出我正确的方向。我有一个"触发器"在我的应用中触发某些行为的单词。该应用程序已运行了几个月,但有时,在调用findAll
期间,发生以下错误:
TypeError: Cannot read property 'getQueryInterface' of undefined
at Model.get (C:\Users\Me\Projects\api\project-name-api\node_modules\sequelize\lib\model.js:104:40)
at Model.get (C:\Users\Me\Projects\api\project-name-api\node_modules\sequelize\lib\model.js:110:17)
at Model.getTableName (C:\Users\Me\Projects\api\project-name-api\node_modules\sequelize\lib\model.js:1087:15)
at Model.findAll (C:\Users\Me\Projects\api\project-name-api\node_modules\sequelize\lib\model.js:1350:19)
at getSession.then.s (C:\Users\Me\Projects\api\project-name-api\lib\message-interpreter.js:148:15)
它也会阻止应用程序运行。
AssertionError [ERR_ASSERTION]: false == true
at Timer.listOnTimeout (timers.js:280:3)
(这甚至与findAll有关吗?这是一个随机的错误吗?因为...)我的findAll
的上下文非常简单。这是一个示例电话:
let words = 'hello world';
Trigger.findAll({
raw: true,
where: {
// Find any available trigger word in the message
word: { $in: msg.split(' ') }
}
}).then(...)
......这就是我所拥有的一切。一堆其他类似的问题似乎是由一些不正确的模型定义引起的,但我已经检查过我的似乎是正确的。只有Trigger
模型(在一堆其他更复杂的模型中)受此影响。
堆栈跟踪让我了解findAll
的定义:事实证明this.modelManager.sequelize
由于某种原因未定义,但我不确定为什么或我应该注意什么纠正这个。我很感激一些指导!
答案 0 :(得分:0)
这是我的错误。
我将我的应用代码修剪为以下内容,其中另一个不相关的模型包含带有函数调用的属性。但是,我使用纯字符串而不是sequelize.fn()
来使用相应的sequelize.col()
和sequelize.literal()
。 INTERVAL <interval> MINUTES
部分让我偏离了轨道,我忘记了literal
功能。代码&#34;工作&#34;,但副作用显示在上面的错误中。
Session.findOrCreate({
having: {
startDate: {
$lt: sequelize.col('expiry')
}
},
raw: true,
attributes: {
include: [
['DATE_ADD(startDate, INTERVAL sessionTimeout MINUTE)', 'expiry']
]
}
});
虽然这似乎解决了这个问题,但我不确定我是否了解其根本原因。为什么sequelize
属性突然未定义?为什么这种行为不会被捕获为错误,而不是传播到这样的事情?也许我应该与Sequelize团队合作。
答案 1 :(得分:0)
就我而言,将模块 sequelize-typescript
从 1.1.0
升级到 2.1.0
解决了该问题。