parse-community / parse-community/parse-server
Parse server throws an error when saving an object with a pointer field set to undefined (Postgres only)
Nobody has claimed this yet.
- Dominant language
- JavaScript
- Stars
- 21.4k
- Forks
- 4.8k
- Avg merge
- 7h 45m
- Merged PRs (30d)
- 11
Description
New Issue Checklist
- Report security issues confidentially.
- Any contribution is under this license.
- Before posting search existing issues.
Issue Description
For Parse server connected to a postgres db, if an object has a Pointer field and that field is set to undefined and saved Parse server will error with TypeError: Cannot read properties of undefined (reading 'objectId')
The full error which I've put below leads to this line in the parse server code https://github.com/parse-community/parse-server/blob/09ead54626a856ec1e0a621a48e089e35ec25df1/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js#L1385
some additional context to the code
switch (schema.fields[fieldName].type) {
case 'Date':
if (object[fieldName]) {
valuesArray.push(object[fieldName].iso);
} else {
valuesArray.push(null);
}
break;
case 'Pointer':
valuesArray.push(object[fieldName].objectId);
break;
case 'Array':
if (['_rperm', '_wperm'].indexOf(fieldName) >= 0) {
valuesArray.push(object[fieldName]);
} else {
valuesArray.push(JSON.stringify(object[fieldName]));
}
break;
It appears that maybe object[fieldName]) needs an if check as it does in the Date case?
Also looking further up
https://github.com/parse-community/parse-server/blob/09ead54626a856ec1e0a621a48e089e35ec25df1/src/Adapters/Storage/Postgres/PostgresStorageAdapter.js#L1327
It looks like this createObject function in the Postgres adapter does check and skip values that are null. Switching the value to null instead of undefined does save without error.
// This works fine
const test2 = new Parse.Object("SomeObject");
test2.set("pointerTo", null);
await test2.save(null, { useMasterKey: true });
Steps to reproduce
// Start a blank Parse Server that is connected to a Postgresql database
// Run the following code on the server after start up
// Create a parse object class
const pointerTestObj = new Parse.Object("PointerTest");
await pointerTestObj.save(null, { useMasterKey: true });
// Create another class that has a pointer to the above class
const obj = new Parse.Object("SomeObject");
obj.set("pointerTo", pointerTestObj);
await obj.save(null, { useMasterKey: true });
// Create another object, but this time the field is set to undefined
const test = new Parse.Object("SomeObject");
test.set("pointerTo", undefined);
await test.save(null, { useMasterKey: true }); // Throws an error on save
Actual Outcome
Saving the object with an undefined pointer field results in:
/src/node_modules/parse-server/lib/ParseServer.js:265
throw err;
^
TypeError: Cannot read properties of undefined (reading 'objectId')
at /src/node_modules/parse-server/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js:1220:46
at Array.forEach (<anonymous>)
at PostgresStorageAdapter.createObject (/src/node_modules/parse-server/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js:1173:25)
at /src/node_modules/parse-server/lib/Controllers/DatabaseController.js:684:29
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Expected Outcome
The object should be able to set a pointer to undefined and save without throwing as it does when connected to a mongo database
Environment
Server
- Parse Server version:
6.5.6 - Operating system:
macOS Somona 14.3 - Local or remote host (AWS, Azure, Google Cloud, Heroku, Digital Ocean, etc):
Local
Database
- System (MongoDB or Postgres):
Postgres - Database version:
postgres:16.3-alpine - Local or remote host (MongoDB Atlas, mLab, AWS, Azure, Google Cloud, etc):
Local
Client
- SDK (iOS, Android, JavaScript, PHP, Unity, etc):
N/A - SDK version:
N/A
Logs
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with src/Adapters/Storage/Postgres/PostgresStorageAdapter.js, especially createObject and the Pointer branch around the reported line. Reproduce the save sequence from the issue against PostgreSQL, then compare its handling of undefined with the null and Date cases. Done means saving an object with an undefined pointer no longer throws and matches the MongoDB behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, node.js, postgresql
- Domain
- backend, databases
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 52/100