parse-server icon indicating copy to clipboard operation
parse-server copied to clipboard

LiveQuery error: protectedFields.forEach is not a function

Open mathieulb opened this issue 2 years ago • 2 comments

New Issue Checklist

Issue Description

error: Failed running afterLiveQueryEvent on class Message for event create with session r:... with: Error: {"message":"protectedFields.forEach is not a function","code":141}

Steps to reproduce

Run a LiveQuery on class X and then creating+saving a object of class X. E.g. in my case using Swift :

let myClient = ParseLiveQuery.Client()
let lq = myClient.subscribe(queryMessage!)
//... then later ... (much after subscription completes)
let m = Message("hello")
m.saveInBackground { _, error in if error != nil {print(error)} else {print("ok")} }

Actual Outcome

I'm not getting any data in the client from this LiveQuery, and the server says protectedFields.forEach fails. Adding a console.log("protectedFields=",protectedFields) in node_modules/parse-server/lib/Controllers/DatabaseController.js:177 shows protectedFields= { '*': [] } instead of an array, only in this case, whereas it's an array like [] or ["email"] in all other cases (that is, for non-LiveQuery things).

Then I went in Dashboard's Security -> Protected Fields and changed things a bit to see whether the logged value really follows the contents of this form, and so I saw protectedFields= { '*': [ 'stuff', 'moreStuff', 'content' ], authenticated: [ 'otherStuff' ]}. So, when exactly can protectedFields be an array ?

Expected Outcome

No error, and actual LiveQuery results.

Environment

Server

  • Parse Server version: 6.3.1 and also 5.5.6
  • Operating system: Linux
  • Local or remote host: Heroku

Database

  • System (MongoDB or Postgres): MongoDB
  • Database version: 3.6.12
  • Local or remote host: Heroku ObjectRocket

Client

  • SDK (iOS, Android, JavaScript, PHP, Unity, etc): iOS (ParseObjC in Swift)
  • SDK version: 2.7.0

Logs

succeeding : protectedFields= [] protectedFields= [ 'email' ]

failing : protectedFields= { '*': [] } protectedFields= { '*': [ 'stuff', 'moreStuff', 'content' ], authenticated: [ 'otherStuff' ] }

mathieulb avatar Oct 31 '23 00:10 mathieulb

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.