parse-server
parse-server copied to clipboard
Sorting by non-existing field returns http error 500
New Issue Checklist
- [x] I am not disclosing a vulnerability.
- [x] I am not just asking a question.
- [x] I have searched through existing issues.
- [x] I can reproduce the issue with the latest version of Parse Server.
Issue Description
If I delete a field that was previously sorted/ordered in Parse Dashboard, when I try to load the records from that class, returns a 500 error.
Steps to reproduce
I created a column (named ‘s’) in the Contact class to test the schema, then I deleted it via Dashboard and via JS SDK but when I click on the dashboard Contact Class, no records are showing, and parse server log complains with error:
error: column "s" does not exist {"code":1,"stack":"Error: error: column \"s\" does not exist\n at /Users/Martin/Dev/Parse-Server/node_modules/parse-server/lib/Controllers/DatabaseController.js:1164:21\n at processTicksAndRejections (node:internal/process/task_queues:96:5)"}
If I create the field again (via dashboard or via JS) the error goes away and the records appear
I found the cause in the POST request when I select the Contact Class that returns a 500 error
XHRPOST http://localhost:1337/parse/classes/Contact
[HTTP/1.1 500 Internal Server Error 6ms]
_ApplicationId "appId"
_ClientVersion "js3.4.1"
_InstallationId "8ad5475f-30e5-4a1"
_MasterKey "masterKey"
_method "GET"
limit 200
order "s" //<-- here is where I realize the problem
where {}
Actual Outcome
Error 500
Expected Outcome
Not get the error and load the records
Environment
Local environment
Server
- Parse Server version:
5.3.2 - Operating system:
macOS Monterrey - Local or remote host (AWS, Azure, Google Cloud, Heroku, Digital Ocean, etc):
Local
Database
- System (MongoDB or Postgres):
Postgres - Database version:
14.3 - Local or remote host (MongoDB Atlas, mLab, AWS, Azure, Google Cloud, etc):
Local(I did not tried in remote)
Client
- SDK (iOS, Android, JavaScript, PHP, Unity, etc):
JavaScript - SDK version:
3.4.2
Logs
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.
So the dashboard is trying to sort by a field that doesn't exist, right?
It's expected that Parse Server returns an error, but it should be a 4xx, not 5xx.
Parse Dashboard also cannot know whether a field still exists before making the query, unless it fetched the schema before each query. So it can either fetch the schema which may be an overhead we don't want, or it should display a proper error that one of the fields doesn't exist. For that, Parse Server needs to returns a proper error code, presumably http 400 and the corresponding Parse.Error code.
So the dashboard is trying to sort by a field that doesn't exist, right?
Yes, to be honest, not sure if this issue is even a parse-server thing...
Quickly thinking a solution should be adding some "check" in parse-dashboard, something like removing the "order" flag in the class before deleting the field in case the class is being sorted by the target field. (Or unsort the field by applying the parse-dashboard feature https://github.com/parse-community/parse-dashboard/issues/2178) Doing this check on deletion, we should not see the 500 error from parse-server anymore
I am assuming that the order is stored in the class somewhere and that the order/sort can only be applied on parse-dasboard, not thru the SDKs.
removing the "order" flag in the class before deleting the field in case the class is being sorted by the target field.
sounds good, but this is a Parse Dashboard issue that needs to be opened separately
(Or unsort the field by applying the parse-dashboard feature https://github.com/parse-community/parse-dashboard/issues/2178)
This is a feature request to manually remove the sort; unrelated to the logic suggested above.
Doing this check on deletion, we should not see the 500 error from parse-server anymore
As discussed, Parse Server should not throw 5xx, but 4xx when sorting by a non-existing field. This is the only issue that needs to be addressed on the Parse Server side, and this issue here should only focus on that. Anything else that concerns Parse Dashboard or SDK side are separate issues that need to be opened in the respective repos.
I am assuming that the order is stored in the class somewhere and that the order/sort can only be applied on parse-dasboard, not thru the SDKs.
There is no server side order; order is a parameter of a query. If a developer deletes a field and then sends a query using an SDK, it is the developer's responsibility to account for the deletion of that field by adapting the query; or properly handle the 4xx server response in case the field doesn't exist anymore.
There is no server side order; order is a parameter of a query. If a developer deletes a field and then sends a query using an SDK, it is the developer's responsibility to account for the deletion of that field by adapting the query; or properly handle the 4xx server response in case the field doesn't exist anymore.
mm.. still confused, the 500 error comes from the parse-dashboard page (not from the server?)

I think parse-dashboard sends some log to parse-server that pops in the parse-server terminal, but from the SDK I can fetch the data with no problems or errors in the browser inspector.

Parse-server logs file shows:
{"code":1,"level":"error","message":{"code":"42703","file":"parse_relation.c","length":101,"line":"3599","name":"error","position":"35","routine":"errorMissingColumn","severity":"ERROR"},"stack":"Error: error: column \"s\" does not exist\n at /Users/Martin/Dev/Parse-Server/node_modules/parse-server/lib/Controllers/DatabaseController.js:1164:21\n at processTicksAndRejections (node:internal/process/task_queues:96:5)","timestamp":"2022-06-26T12:13:30.831Z"}
{"code":1,"level":"error","message":{"code":"42703","file":"parse_relation.c","length":101,"line":"3599","name":"error","position":"35","routine":"errorMissingColumn","severity":"ERROR"},"stack":"Error: error: column \"s\" does not exist\n at /Users/Martin/Dev/Parse-Server/node_modules/parse-server/lib/Controllers/DatabaseController.js:1164:21\n at runMicrotasks (<anonymous>)\n at processTicksAndRejections (node:internal/process/task_queues:96:5)","timestamp":"2022-06-26T19:27:32.959Z"}
Note that if I create the field again, automatically shows the sort arrow, so the order/sort of the class "viewer" has to be stored somewhere 🤔🤷♂️

not sure if related, but I cannot access the Logs in my local dev parse-server installation via parse-dashboard.
If I press the "Logs" I got a blank screen and lots of errors in the inspector.. (I did not dig into this problem yet...)
This is the Parse Server issue, so let's focus on the Parse Server side here and forget about the dashboard for now.
The 500 http error comes from the server. Parse Server should never return a 500 error; it means that something wasn't handled properly inside Parse Server. The usual approach would be to create a PR with a failing test. Just write a minimal code example and try to reproduce what you observe, so that the test fails with a 500 code. As I understand, the test would be to create a query and order by a non-existing field. The test should expect a 4xx error with the correct Parse.Error. Looking at the error codes it should probably be 105, InvalidFieldName; but you'd have to check which error is returned when you specify an in valid field name for other constraints, like a equalTo.
Anything else that is Parse Dashboard related should be discussed in a separate issue in that repo.
@MrMartinR I have tried to replicate this but have been able. I am on the latest dashboard and parse server.
I've tried to manually add the invalid order key to the fetch payload, here is the request:
fetch('PARSE_URL/classes/_User', {
body: JSON.stringify({
order: 's',
where: {},
_ApplicationId: APP_ID,
_ClientVersion: 'js3.4.2',
_MasterKey: MASTER_KEY,
_method: 'GET',
}),
method: 'POST',
})
.then(res => res.json())
.then(obj => console.log(obj));
@dblythy are you getting the error500?
No I wasn't, I'm getting results
I'm using Dashboard 4.2.0-ALPHA.4 and Server 3.4.3, if the column s doesn't exist I assume you getting the results with no errors and unsortered?
Just to be clear: Sort a column from the Dashboard (the column header shows the little arrow), delete the column, change to another class/table, change back again to the class/table where the sort field was deleted, I got no records showing on Dashboard and the Error500 on parse server terminal.
Ahh, in my testing I was using mongo. I’ll try again with Postgres tomorrow
🎉 This change has been released in version 5.3.0-alpha.26
🎉 This change has been released in version 5.4.0-beta.1
🎉 This change has been released in version 5.4.0-alpha.1
🎉 This change has been released in version 5.4.0
🎉 This change has been released in version 5.4.0