查询为空 Nodejs Sequlize

问题描述 投票:0回答:2

我正在尝试更新 Nodejs 应用程序中的数据。我和邮递员测试过。

我的开发步骤是:

  1. 从数据库(MySQL)获取id为10的数据进行更新>>未处理的拒绝SequelizeDatabaseError:查询为空

  2. 我认识到,我使用了错误的ID,所以我改成了正确的ID:50>>一些其他错误

  3. 好吧,我修复了与我的不准确工作相关的其他一些错误,并使用良好的 id:50 >> 未处理的拒绝 SequelizeDatabaseError:未处理的拒绝 SequelizeDatabaseError:查询为空
  4. 奇怪的行为,因为这个 id 之前很好...(在第 3 步中)好的,我只是将 id 更改为其他正确的:51 >> 其他一些错误
  5. 好的,我修复了另一个错误,尝试使用新的 id 再次更新:51 >> 未处理的拒绝 SequelizeDatabaseError:查询为空

在我看来,我只能一次获得有效数据,在我无法到达之后...... 完整的堆栈跟踪:

Unhandled rejection SequelizeDatabaseError: Query was empty
    at Query.formatError (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\sequelize\lib\dialects\mysql\query.js:223:16)
    at Query.connection.query [as onResult] (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\sequelize\lib\dialects\mysql\query.js:55:23)
    at Query.Command.execute (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\mysql2\lib\commands\command.js:30:12)
    at Connection.handlePacket (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\mysql2\lib\connection.js:515:28)
    at PacketParser.onPacket (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\mysql2\lib\connection.js:94:16)
    at PacketParser.executeStart (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\mysql2\lib\packet_parser.js:77:14)
    at Socket.<anonymous> (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\mysql2\lib\connection.js:102:29)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:176:18)
    at Socket.Readable.push (_stream_readable.js:134:10)
    at TCP.onread (net.js:547:20

想法?

注意

我的问题与模型数据库同步无关。这些是同步的,因为我有一个案例 - 第一次调用 - 当我可以更新对象时!但是如果我测试该 id 两次、第三次等...我会收到此错误。因此,如果这些不同步,那么我也无法在第一时间更新对象

更新

经过一天的debbing,我才发现,第二次和第三次sequulize生成了空的SQL查询。下面是代码片段:

良好的 SQL 更新:

Executing (default): UPDATE `cardModules` SET `field1`='xxxxxxxx',`field2`='xxxxxxxxxx',`field3`='MEDIUM',`field4`=false,`field5`=false WHERE `id` = 43

糟糕的 SQL 更新:

Executing (default):

问题是:为什么要进行 Sequlize?

javascript mysql node.js sequelize.js postman
2个回答
7
投票

为了更清楚地了解如何/为什么会发生这种情况:通常,Sequelize 将跟踪模型的更改,然后当您调用 model.save() 时,它只会尝试更新已更改的 SQL 列。

let person = async Employee.findOne();
person.name = "Jerry Jones";  
person.save();  //All good here, and only the name column will be updated

如果没有属性发生更改,它甚至不会尝试进行 SQL 调用

let person = async Employee.findOne();
person.save();  //No errors, but no SQL call will be made

但是,任何设置为“未定义”值(与 null 不同!)的属性仍将导致模型被标记为脏/已更改,但在构造 SQL 调用时将被忽略。因此,如果您只更改一个属性并将其设置为未定义,Sequelize 仍将尝试进行调用,但查询将为空。

let userUpdates = {age: 99, title: "Developer"};
let person = async Employee.findOne();
person.name = userUpdates.name;  //name is undefined, but property will still be considered changed.
person.save();                   //Query will be empty!!

7
投票

我刚刚意识到问题的小时数。如果 sequlize 在数据库值和可更新值中没有发现任何差异,那么将生成一个空的 SQL 字符串并想要执行它。因此,相同的 sequlize 会抛出此 Query wasempty 消息。

因此,如果没有任何更改但您想更新,您将收到此错误。

我处理这个问题是为了检查错误消息,例如:

if (err.message == 'Query was empty'){
    console.log('There is no changes in the update, lets continue the progress...');
    next();
}
© www.soinside.com 2019 - 2024. All rights reserved.