Event object is always empty with no query params in netlify functions

netlify site name. geralds-test-app.netlify.app

I have a brand new angular project with netlify that has a single endpoint that calls a test function. The function/endpoint is being called however the event object is always empty and I can not pass query params or a request body to it. I’ve spent 2 nights trying to resolve the issue to no avail.

This is my output when I start up with netlify dev. Notice event is empty and there are no query params.

Request from ::1: GET /.netlify/functions/test-params?id=3
Received event: {}
Event object: Request {
  method: 'GET',
  url: 'http://localhost:3000/.netlify/functions/test-params?id=3',
  headers: Headers {
    'x-forwarded-for': '::1',
    'x-nf-blobs-info': 'eyJ1cmwiOiJodHRwOi8vbG9jYWxob3N0OjU5NzEwIiwidXJsX3VuY2FjaGVkIjoiaHR0cDovL2xvY2FsaG9zdDo1OTcxMCIsInRva2VuIjoiMTQ5MWZiMDEtOGJmNi00MzZkLWI2MjctOGY3YmI2NWUwY2QzIn0=',
    'x-nf-account-info': 'eyJpZCI6IjY4NzViYzU1NTFiYWZlMjIzNjFlMTdhNiJ9',
    'x-nf-site-info': 'eyJpZCI6IjlkMWMyMzBmLWVkNmMtNGNkNC1hNGIzLTEzZTUwNWExNjM2MSIsIm5hbWUiOiJnZXJhbGRzLXRlc3QtYXBwIiwidXJsIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIn0=',
    'x-nf-deploy-context': 'dev',
    'x-nf-deploy-id': '0',
    'x-nf-geo': 'eyJjaXR5IjoiU291dGggSm9yZGFuIiwiY291bnRyeSI6eyJjb2RlIjoiVVMiLCJuYW1lIjoiVW5pdGVkIFN0YXRlcyJ9LCJzdWJkaXZpc2lvbiI6eyJjb2RlIjoiVVQiLCJuYW1lIjoiVXRhaCJ9LCJ0aW1lem9uZSI6IkFtZXJpY2EvRGVudmVyIiwibGF0aXR1ZGUiOjQwLjU1MjYsImxvbmdpdHVkZSI6LTExMS45NDUzLCJwb3N0YWxDb2RlIjoiODQwOTUifQ==',
    'accept-encoding': 'gzip, deflate',
    'user-agent': 'node',
    'sec-fetch-mode': 'cors',
    'accept-language': '*',
    accept: 'application/json, text/plain, */*',
    connection: 'close',
    host: 'localhost:3000',
    'x-nf-request-id': '01K0X3MVFMHEQF22T86Y0RNTB6',
    'client-ip': '::1',
    'x-nf-client-connection-ip': '::1',
    'x-nf-account-id': '6875bc5551bafe22361e17a6',
    'x-nf-site-id': '9d1c230f-ed6c-4cd4-a4b3-13e505a16361'
  },
  destination: '',
  referrer: 'about:client',
  referrerPolicy: '',
  mode: 'cors',
  credentials: 'same-origin',
  cache: 'default',
  redirect: 'follow',
  integrity: '',
  keepalive: false,
  isReloadNavigation: false,
  isHistoryNavigation: false,
  signal: AbortSignal { aborted: false }
}
HTTP Method: undefined
Query parameters: undefined
Response with status 200 in 279 ms.

Here are my project specs from my package.json:

"dependencies": {
    "@angular/common": "^20.0.0",
    "@angular/compiler": "^20.0.0",
    "@angular/core": "^20.0.0",
    "@angular/forms": "^20.0.0",
    "@angular/platform-browser": "^20.0.0",
    "@angular/platform-server": "^20.0.0",
    "@angular/router": "^20.0.0",
    "@angular/ssr": "^20.0.5",
    "@netlify/angular-runtime": "^2.4.0",
    "express": "^5.1.0",
    "rxjs": "~7.8.0",
    "tslib": "^2.3.0",
    "zone.js": "~0.15.0"
  },
  "devDependencies": {
    "@angular/build": "^20.0.5",
    "@angular/cli": "^20.0.5",
    "@angular/compiler-cli": "^20.0.0",
    "@types/express": "^5.0.1",
    "@types/jasmine": "~5.1.0",
    "@types/node": "^20.17.19",
    "jasmine-core": "~5.7.0",
    "karma": "~6.4.0",
    "karma-chrome-launcher": "~3.2.0",
    "karma-coverage": "~2.2.0",
    "karma-jasmine": "~5.1.0",
    "karma-jasmine-html-reporter": "~2.1.0",
    "typescript": "~5.8.2"
  }

Node version 20.19.4
npm version 11.4.2

Here is my app.ts

import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { RouterOutlet } from '@angular/router';

@Component({
  selector: 'app-root',
  imports: [RouterOutlet],
  templateUrl: './app.html',
  styleUrl: './app.scss'
})
export class App implements OnInit {
  protected title = 'test-app';

  constructor(private http: HttpClient) { }

  ngOnInit(): void {
    this.http.get(`/.netlify/functions/test-params?id=3`).subscribe();
  }
}

Here is my test function from my functions folder

export default async (event, context) => {
  console.log('Received event:', JSON.stringify(event, null, 2));
  console.log("Event object:", event);
  console.log("HTTP Method:", event.httpMethod);
  console.log("Query parameters:", event.queryStringParameters);

  return new Response(JSON.stringify({
    message: 'Invoke test successful',
    qs: event.queryStringParameters || 'no query params'
  }), {
    headers: { 'Content-Type': 'application/json' },
    status: 200
  });
};

Here is my .toml

[build]
  command = "npm run build"
  functions = "netlify/functions"
  publish = "dist"

[[redirects]]
  from = "/*"
  to = "/index.html"
  status = 200

[dev]
  functions = "functions"
  command = "ng serve"
  port = 3000
  publish = "dist"

What am I doing wrong? Why can’t I pass query params to my netlify functions/endpoints?

I have also tried with netlify-cli v21 and node 20.19.4.
I have tried using curl e.g (curl "http://localhost:8888/.netlify/functions/yourFunctionName?param1=value1&param2=value2")
I have tried netlify functions:invoke
I have tried uninstalling and reinstalling netlify
I have tried creating a complety new angular/netlify app from scratch

The correct code:

export default async (request, context) => {
  // invalid: console.log('Received event:', JSON.stringify(event, null, 2));
  console.log("Request:", request);
  console.log("HTTP Method:", request.method);
  console.log("Query parameters:\n");
  context.url.search.forEach((value, key) => {
    console.log(`${key}: ${value}\n`);
  });

  return Response.json({
    message: 'Invoke test successful',
    // change this as needed: qs: event.queryStringParameters || 'no query params'
  });
};

The actual issue was the export line on my functions. I replaced export default async (event, context) with export const handler = async (event, context) and it worked.
I figured it out a few days after posting the question, but I couldn’t find a way to post an answer to the question on this form. It looks like now I can replay though so IDK what was going on.

What you have done is shifted to Netlify Functions v1 which is an older API and no longer receiving any updates. What I suggested (and you were already using) was Functions API v2, which is the recommended standard.