Parse-SDK-JS icon indicating copy to clipboard operation
Parse-SDK-JS copied to clipboard

Internal server error on set followed by unset

Open mstniy opened this issue 2 years ago • 12 comments

New Issue Checklist

Issue Description

Setting a subdocument entirely, followed by an unset of a nested field causes an internal server error while the object is being saved, if the object existed beforehand.

Steps to reproduce

const myObj = new Parse.Object('MyClass');
await myObj.save(null, {useMasterKey: true});
myObj.set('data', {a: 5});
myObj.unset('data.a');
await myObj.save(null, {useMasterKey: true});
console.log('a');

Actual Outcome

error: Uncaught internal server error. Updating the path 'data.a' would create a conflict at 'data' {"code":40,"codeName":"ConflictingUpdateOperators","ok":0,"stack":"MongoServerError: Updating the path 'data.a' would create a conflict at 'data'\n    at Connection.onMessage (/home/kartal/Desktop/ocell/parse-server-example/node_modules/parse-server/node_modules/mongodb/lib/cmap/connection.js:202:30)\n    at MessageStream.<anonymous> (/home/kartal/Desktop/ocell/parse-server-example/node_modules/parse-server/node_modules/mongodb/lib/cmap/connection.js:62:60)\n    at MessageStream.emit (events.js:400:28)\n    at processIncomingData (/home/kartal/Desktop/ocell/parse-server-example/node_modules/parse-server/node_modules/mongodb/lib/cmap/message_stream.js:108:16)\n    at MessageStream._write (/home/kartal/Desktop/ocell/parse-server-example/node_modules/parse-server/node_modules/mongodb/lib/cmap/message_stream.js:28:9)\n    at writeOrBuffer (internal/streams/writable.js:358:12)\n    at MessageStream.Writable.write (internal/streams/writable.js:303:10)\n    at Socket.ondata (internal/streams/readable.js:731:22)\n    at Socket.emit (events.js:400:28)\n    at addChunk (internal/streams/readable.js:293:12)"}
MongoServerError: Updating the path 'data.a' would create a conflict at 'data'
    at Connection.onMessage (/home/kartal/Desktop/ocell/parse-server-example/node_modules/parse-server/node_modules/mongodb/lib/cmap/connection.js:202:30)
    at MessageStream.<anonymous> (/home/kartal/Desktop/ocell/parse-server-example/node_modules/parse-server/node_modules/mongodb/lib/cmap/connection.js:62:60)
    at MessageStream.emit (events.js:400:28)
    at processIncomingData (/home/kartal/Desktop/ocell/parse-server-example/node_modules/parse-server/node_modules/mongodb/lib/cmap/message_stream.js:108:16)
    at MessageStream._write (/home/kartal/Desktop/ocell/parse-server-example/node_modules/parse-server/node_modules/mongodb/lib/cmap/message_stream.js:28:9)
    at writeOrBuffer (internal/streams/writable.js:358:12)
    at MessageStream.Writable.write (internal/streams/writable.js:303:10)
    at Socket.ondata (internal/streams/readable.js:731:22)
    at Socket.emit (events.js:400:28)
    at addChunk (internal/streams/readable.js:293:12)

Expected Outcome

The object should be saved to the database with data = {}

Environment

Server

  • Parse Server version: 5.3.0
  • Operating system: ubuntu 20.04
  • Local or remote host (AWS, Azure, Google Cloud, Heroku, Digital Ocean, etc): local

Database

  • System (MongoDB or Postgres): MongoDB
  • Database version: 5.0.13
  • Local or remote host (MongoDB Atlas, mLab, AWS, Azure, Google Cloud, etc): local

Client

  • SDK (iOS, Android, JavaScript, PHP, Unity, etc): parse dashboard
  • SDK version: 4.1.4

Logs

mstniy avatar Nov 02 '22 16:11 mstniy

Thanks for opening this issue!

  • 🚀 You can help us to fix this issue faster by opening a pull request with a failing test. See our Contribution Guide for how to make a pull request, or read our New Contributor's Guide if this is your first time contributing.

Thanks for opening this issue!

  • 🚀 You can help us to fix this issue faster by opening a pull request with a failing test. See our Contribution Guide for how to make a pull request, or read our New Contributor's Guide if this is your first time contributing.

Nice find! Do you want to open a PR? This may well be a Parse JS SDK issue rather than a Parse Server issue, if the SDK doesn't handle this set / unset properly. Did you look at what the SDK sends to the server?

mtrezza avatar Nov 02 '22 23:11 mtrezza

I have verified that the SDK sends a malformed request to the server, so this is an SDK issue.

mstniy avatar Nov 09 '22 20:11 mstniy

Great, would you want to open a PR with a failing test?

mtrezza avatar Nov 09 '22 23:11 mtrezza

@mstniy Do you have any more infos on this issue? Otherwise I'll transfer it to the Parse JS SDK.

mtrezza avatar Mar 01 '23 08:03 mtrezza

I am afraid not, @mtrezza . Feel free to transfer the issue. We ended up working around it.

mstniy avatar Mar 01 '23 08:03 mstniy

Looking at this for a moment, not sure there isn't more related issues.

Trying to just add data.b (not unsetting) and trying to get it after removes locally the previous value. It doesn't merge the ops locally.

Screenshot 2024-04-17 at 9 07 51 PM

I didn't realize dot notation was even supported on set/get, but there seem to be a lot of issues with it.

mortenmo avatar Apr 18 '24 02:04 mortenmo