Open
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
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
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