查询是空的Nodejs Sequlize

时间:2018-01-02 13:16:53

标签: javascript mysql node.js sequelize.js postman

我正在尝试更新nodejs应用程序中的数据。我用邮递员测试了它。

我的发展步骤是:

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

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

  3. 好的,我解决了与我的不正确工作相关的其他错误,并使用了良好的ID:50>>未处理的拒绝SequelizeDatabaseError:未处理的拒绝SequelizeDatabaseError:查询为空
  4. 奇怪的行为,因为这个id早先好了...(在3.步骤中)好的,我只是将id更改为另一个正确的ID:51>>其他一些错误
  5. 好的,我修正了其他错误,请使用新的新ID再次尝试更新:51>>未处理的拒绝SequelizeDatabaseError:查询为空
  6. 在我看来,在我无法达到它之后,我只能获得一次有效数据...... 完整的堆栈跟踪:

    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两次,第三次等......我得到了这个错误。所以,如果这些都不是同义词,那么我无法在第一次更新obejct

    更新

    经过一天的讨论,我刚刚认识到,第二次和第三次sequlize进行空SQL查询。在代码片段下面:

    良好的SQL更新:

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

    错误的SQL更新:

    Executing (default):
    

    问题是:为什么Sequlize这个?

2 个答案:

答案 0 :(得分:4)

我刚刚发现问题的小时数。如果sequlize没有发现DB值和可更新值的任何差异,那么将生成一个空的SQL字符串并想要执行它。因此,相同的sequlize抛出此查询为空消息。

因此,如果没有更改但您想要更新,则会收到此错误。

我处理此问题以检查错误消息,如:

            if(err.message == 'Query was empty'){
                console.log('There is no changes in the update, lets continue the progress...');
                next();
            }

答案 1 :(得分:2)

要更多地了解如何/为什么发生这种情况:通常,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

但是,任何设置为“ undefined”值(不同于null的值)的属性仍将导致模型被标记为脏/已更改,但在构造SQL调用时将被忽略。因此,如果仅更改一个属性并将其设置为undefined,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!!