Skip to content

Parse server throws an error when saving an object with a pointer field set to undefined (Postgres only) #9146

Open
@andrewalc

Description

@andrewalc

New Issue Checklist

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

valuesArray.push(object[fieldName].objectId);

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

if (object[fieldName] === null) {

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    type:bugImpaired feature or lacking behavior that is likely assumed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions