parse-community / parse-server

Parse Server for Node.js / Express
https://parseplatform.org
Apache License 2.0
20.86k stars 4.78k forks source link

Explicitly setting a property of a record to "undefined" and saving it to the database stores null instead of undefined #9139

Open anders-topp opened 4 months ago

anders-topp commented 4 months ago

New Issue Checklist

Issue Description

Recently upgraded from Parse 4.10 to Parse 6.5 and noticed the following change in behavior which i assume is a bug.

When storing a record in the database that has a property explicitly set to "undefined", a null value is stored. I.e. the behavior is different than if you do not set a property on the object as save it. Again, in Parse 4.10, storing a property explicitly set to undefined, did not touch the property (i.e. left it to whatever it was before, for example undefined).

Steps to reproduce

Use the JS SDK. Create an empty record in the parse dashboard. explicitly set a property to "undefined" of a record using the JS sdk. store the record. look at the database in the dashboard and see that the value is Null instead of undefined

Actual Outcome

Null stored in the property of the db

Expected Outcome

The property not to be updated

Environment

Server

Database

Client

Logs

parse-github-assistant[bot] commented 4 months ago

Thanks for opening this issue!

mtrezza commented 4 months ago

Why would you set a property to undefined - or anything for that matter - if you don't want it to change?

anders-topp commented 4 months ago

You might have code like this const obj = { prop1:1, optionalProp2:2, // optionalProp3:3 in this case this property is not set }

myRecord.a = obj.prop1; myRecord.b = obj.optionalProp2; myRecord.c = obj.optionalProp3; // this will explicity set c to "undefined" if this property was not set 'obj'

Of course it's easy to avoid this by checking for undefined before assigning, but that assumes you understand the difference between an unassigned property and a property set to "undefined" and know that Parse treats these cases differently.

anders-topp commented 4 months ago

... sorry, part of my last response was lost.

But doing Object.keys (myRecord) and then set all these values using the JS SDK would cause a record.Set ("optionalProp3", undefined);.

Anyway, the behaviour is different than older Parse versions so it should at least be captured in release notes / migration notes.

mtrezza commented 4 months ago

Did you check the changelog entries of the releases? This change may be a deliberate result of a previous discussion.