parse-community / parse-community/parse-server

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

Open
#9,146 5 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

type:bug
Dominant language
JavaScript
Stars
21.4k
Forks
4.8k
Avg merge
7h 45m
Merged PRs (30d)
11

Description

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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.