Fix TypeError Cannot Read Properties Of Undefined Reading Number
TypeError: Cannot read properties of undefined (reading 'number')
This error often occurs in GitHub Actions workflows when an action attempts to access the number
property of an undefined pull_request
object. This typically happens when the workflow is triggered by a push
event instead of a pull_request
event. Let's dive into the details, understand why this happens, and explore how to fix it.
Understanding the Error
The error message TypeError: Cannot read properties of undefined (reading 'number')
indicates that you're trying to access a property (number
in this case) on an object that is undefined
. In the context of GitHub Actions, this usually means that the eventPayload.pull_request
object is undefined when your action expects it to be defined.
Why Does This Happen?
This issue commonly arises when a GitHub Actions workflow is configured to run on both push
and pull_request
events. When a new commit is pushed to a pull request, the workflow may be triggered twice:
- Once by the
push
event. - Once by the
pull_request
event.
The parkerbxyz/suggest-changes
action, as mentioned in the original post, is designed to work specifically with pull_request
events because it needs pull request context to create review comments. When the workflow runs due to a push
event, the eventPayload
might not contain the pull_request
object, leading to the dreaded TypeError.
Deep Dive into the Problem
To really grasp this issue, let's break down the error and the context in which it occurs. The specific line of code causing the error is:
const pull_number = Number(eventPayload.pull_request.number);
Here, the code is trying to get the pull request number from the eventPayload
which is the data associated with the event that triggered the workflow. If eventPayload.pull_request
is undefined
, then attempting to access pull_request.number
will result in the TypeError
. This usually happens when the workflow is triggered by an event that doesn't inherently have a pull request context, such as a direct push to a branch.
Examining the Workflow Runs
The provided information highlights that the workflow was triggered by both push
and pull_request
events. The workflow run triggered by the push
event failed, while the one triggered by the pull_request
event succeeded. This discrepancy is a clear indicator of the issue. The push
event doesn't provide the same context as a pull_request
event, hence the missing pull_request
object in the payload.
The Role of the parkerbxyz/suggest-changes
Action
The parkerbxyz/suggest-changes
action is designed to suggest code changes within a pull request. It needs the pull request number to add comments and suggestions appropriately. When this action runs outside the context of a pull request (i.e., triggered by a push
event), it lacks the necessary information, leading to the error.
Solutions to the TypeError
Fortunately, there are straightforward solutions to prevent this error. The key is to ensure that the workflow runs only when it has the necessary pull request context. Here are two recommended options:
Option 1: Trigger Only on pull_request
Events
The simplest and often most effective solution is to configure your workflow to trigger only on pull_request
events. This ensures that the workflow always runs within the context of a pull request, providing the necessary pull_request
object in the eventPayload
.
To implement this, modify your workflow file (usually .github/workflows/your-workflow-name.yml
) to include only the pull_request
trigger:
on:
- push:
pull_request:
By removing the push
trigger, you ensure that the workflow runs exclusively for pull request-related activities. This is the recommended approach because the pull_request
event runs in the context of the merge commit, making redundant runs after merging the pull request unnecessary.
Option 2: Add Branch Filtering to the push
Trigger
Alternatively, you can keep the push
trigger but add a branches
filter to it. This allows the workflow to run on pushes, but only to specific branches, such as your main branch. This can be useful if you want to perform certain checks or actions only when code is pushed directly to the main branch, while still relying on the pull_request
trigger for pull request-specific tasks.
To implement this, modify your workflow file to include the branches
filter under the push
trigger:
on:
push:
+ branches: [main]
pull_request:
Make sure to replace main
with the name of your default branch (e.g., develop
, master
). This configuration ensures that the workflow only runs on pushes to the specified branch, preventing the error when pushing to a pull request branch.
Implementing the Fix: A Step-by-Step Guide
Okay, let's get practical. Here's how you can implement these solutions step-by-step:
- Locate Your Workflow File: Navigate to your repository on GitHub and find the
.github/workflows
directory. Inside, you'll find one or more YAML files that define your workflows. Identify the workflow file that's causing the issue. - Edit the Workflow File: Click on the file and then click the