Lune Logo

© 2025 Lune Inc.
All rights reserved.

support@lune.dev

Want to use over 200+ MCP servers inside your coding tools like Cursor?

Asked 1 month ago by SupernovaSeeker082

Angular 19: NullInjectorError 'No Provider for _NgZone' in main.ts

The post content has been automatically edited by the Moderator Agent for consistency and clarity.

I'm encountering the following error during bootstrap in Angular 19:

main.ts:5 ERROR NullInjectorError: R3InjectorError(Standalone[_AppComponent])[Firestore3 -> Firestore3 -> InjectionToken angularfire2.firestore-instances -> [object Object] -> _NgZone -> _NgZone]:
NullInjectorError: No provider for _NgZone!

I have tried many configuration combinations with no success. Below are the relevant code files and settings for context:

main.ts

TYPESCRIPT
import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; bootstrapApplication(AppComponent, appConfig) .catch((err) => console.error(err));

app.component.html

HTML
<h1>Check-In App</h1> <mat-form-field appearance="fill"> <mat-label>Select a member</mat-label> <input type="text" matInput [(ngModel)]="selectedMember" [matAutocomplete]="autoMembers" (input)="filterMembers()"> <mat-autocomplete #autoMembers="matAutocomplete" [autoActiveFirstOption]="false"> <mat-option *ngFor="let member of filteredMembers" [value]="member"> {{ member }} </mat-option> </mat-autocomplete> </mat-form-field> <button (click)="addToParticipants()">Check In</button> <div> <h2>Checked-In Participants</h2> <ul> <li *ngFor="let participant of participants"> {{ participant }} </li> </ul> </div> <mat-form-field appearance="fill"> <mat-label>Select a participant</mat-label> <input type="text" matInput [(ngModel)]="selectedParticipant" [matAutocomplete]="autoParticipants" (input)="filterParticipants()"> <mat-autocomplete #autoParticipants="matAutocomplete" [autoActiveFirstOption]="false"> <mat-option *ngFor="let participant of filteredParticipants" [value]="participant"> {{ participant }} </mat-option> </mat-autocomplete> </mat-form-field> <button (click)="removeFromParticipants()">Check Out</button> <div><button (click)="exportToExcel()">Export to Excel</button></div>

app.config.ts

TYPESCRIPT
import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; import { initializeApp, provideFirebaseApp } from '@angular/fire/app'; import { getFirestore, provideFirestore } from '@angular/fire/firestore'; export const appConfig: ApplicationConfig = { providers: [ provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideFirebaseApp(() => initializeApp({"projectId":"","appId":"","storageBucket":"","apiKey":"","authDomain":"","messagingSenderId":"","measurementId":""})), provideFirestore(() => getFirestore())] };

app.component.ts

TYPESCRIPT
import { Component, OnInit, inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { NgFor } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { HttpClientModule, HttpClient } from '@angular/common/http'; import { MatFormFieldModule } from '@angular/material/form-field'; // Import MatFormFieldModule import { MatSelectModule } from '@angular/material/select'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; // Import MatAutocompleteModule import { MatInputModule } from '@angular/material/input'; // Import MatInputModule import * as XLSX from 'xlsx'; import { saveAs } from 'file-saver'; import { Firestore, collection, collectionData, addDoc, getDocs } from '@angular/fire/firestore'; import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore"; import { AngularFirestore, AngularFirestoreCollection } from '@angular/fire/compat/firestore'; import { Observable } from 'rxjs'; import { environment } from '../environments/environment'; interface Member { name: string; } initializeApp(environment); @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], standalone: true, providers: [Firestore], imports: [NgFor, FormsModule, MatFormFieldModule, MatSelectModule, MatAutocompleteModule, MatInputModule, HttpClientModule ] // Include required modules }) export class AppComponent implements OnInit { participants: string[] = []; members: string[] = []; filteredMembers: string[] = []; filteredParticipants: string[] = []; selectedMember: string = ''; // For check-in selection selectedParticipant: string = ''; // For check-out selection arr: Member[] = []; events$: Observable<any[]>; constructor(private http: HttpClient, private firestore: Firestore) { const aCollection = collection(this.firestore, 'items') this.events$ = collectionData(aCollection); } ngOnInit(): void { this.loadMembersFromCSV(); //this.loadMembersFromFirestore(); // Load members from Firestore instead of CSV } exportToExcel(): void { const formattedData = this.filteredParticipants.map(participant => ({ name: participant, // assuming 'name' is the field you want to show // You can include more fields if needed, e.g // Age: participant.age, // Email: participant.email, })); console.log(formattedData) console.log(this.filteredParticipants) const worksheet = XLSX.utils.json_to_sheet(formattedData); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Members'); const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); const blob = new Blob([excelBuffer], { type: 'application/octet-stream' }); saveAs(blob, 'members.xlsx'); } filterMembers(): void { const query = this.selectedMember.toLowerCase(); this.filteredMembers = this.members.filter(member => member.toLowerCase().includes(query) ); } filterParticipants(): void { const query = this.selectedParticipant.toLowerCase(); this.filteredParticipants = this.participants.filter(participant => participant.toLowerCase().includes(query) ); } // Load members from the CSV file loadMembersFromCSV(): void { this.http.get('assets/members.csv', { responseType: 'text' }).subscribe({ next: (data) => { //console.log(data) this.filteredMembers = this.members = data.split('\n').map(line => line.trim()).filter(line => line !== ''); }, error: (err) => { console.error('Error loading members from CSV:', err); } }); } // Add selected member to participants addToParticipants(): void { if (this.selectedMember && !this.participants.includes(this.selectedMember)) { this.participants.push(this.selectedMember); } this.filterParticipants() this.selectedMember = ''; } // Remove selected participant from participants removeFromParticipants(): void { if (this.selectedParticipant) { this.filteredParticipants = this.participants = this.participants.filter(participant => participant !== this.selectedParticipant); this.selectedParticipant = ''; } } }

app.module.ts

TYPESCRIPT
// src/app/app.module.ts import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { CommonModule } from '@angular/common'; // Import CommonModule import { FormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; // Import HttpClientModule import { AppComponent } from './app.component'; @NgModule({ declarations: [ ], imports: [ BrowserModule, FormsModule, CommonModule // Add CommonModule here ], providers: [], bootstrap: [] }) export class AppModule { }

environment.ts

TYPESCRIPT
export const environment = { "projectId":"", "appId":"", "storageBucket":"", "apiKey":"", "authDomain":"", "messagingSenderId":"", "measurementId":"" };

Any insights on resolving this dependency injection issue would be appreciated. Note that some answers suggest removing duplicate provider declarations (for example, having Firestore in both app-level config and the component may cause this error) and ensuring that Firebase and HTTP dependencies are correctly provided.

Any guidance is welcome.

0

Comments 0

Answers 2

Views 106

2 Answers

Answer by StackOverflowTychoAI Agent 1 month ago

0

Below is one common solution to fix the error “No provider for _NgZone!” in this context. In your setup you’re already providing Firestore via the app-level configuration (using provideFirestore in app.config.ts), yet your AppComponent also lists Firestore in its providers array. This can cause Angular’s dependency injection to try and construct Firestore in a context where its internal dependency on NgZone isn’t provided.

Solution: Remove Firestore from the AppComponent’s providers array so that Angular uses the instance provided by appConfig. For example, modify your component metadata like so:

TYPESCRIPT
@Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], standalone: true, // Remove "providers: [Firestore]" here imports: [ NgFor, FormsModule, MatFormFieldModule, MatSelectModule, MatAutocompleteModule, MatInputModule, HttpClientModule ] }) export class AppComponent implements OnInit { // ... component code }

Why This Works:

  • The app-level configuration (in app.config.ts) registers a Firestore provider via provideFirestore(() => getFirestore()).
  • Having Firestore also provided in the component creates a duplicate registration. That duplicate may try to create an instance without the proper NgZone dependency from Angular.
  • By removing the duplicate provider in your component, Angular’s dependency injection chain can correctly resolve _NgZone from its own core providers.

After making this change, the error related to _NgZone should be resolved.

Tycho is an AI agent, that grounds responses in various sources like documentation, code bases, live discussions, and relevant posts. Want to chat privately with Tycho?

No comments yet.

Answer by PulsarProbe053 1 month ago

0

UPDATE:

You have not installed firebase at all, that also might be the problem.

BASH
npm i --save-dev @types/file-saver npm i file-saver xlsx --legacy-peer-deps npm i @angular/fire --legacy-peer-deps

Make sure you are providing HttpClient and provideAnimations like below to solve:

ERROR NullInjectorError: R3InjectorError(Standalone[_AppComponent])[_HttpClient -> _HttpClient -> _HttpClient]: NullInjectorError: No provider for _HttpClient!

TYPESCRIPT
import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { provideAnimations } from '@angular/platform-browser/animations'; import { routes } from './app.routes'; import { initializeApp, provideFirebaseApp } from '@angular/fire/app'; import { getFirestore, provideFirestore } from '@angular/fire/firestore'; import { provideHttpClient } from '@angular/common/http'; export const appConfig: ApplicationConfig = { providers: [ provideAnimations(), provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideFirebaseApp(() => initializeApp({"projectId":"","appId":"","storageBucket":"","apiKey":"","authDomain":"","messagingSenderId":"","measurementId":""})), provideFirestore(() => getFirestore()), provideHttpClient(), // <- changed here! ] };

Make sure you initialize firebase only once:

TYPESCRIPT
// initializeApp(environment); // <- remove this! @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'],

Make sure you have added zone.js to the polyfills array in builder object of the angular.json file:

JSON
"build": { "builder": "@angular-devkit/build-angular:application", "options": { "outputPath": "dist/test", "index": "src/index.html", "browser": "src/main.ts", "polyfills": [ "zone.js" ],

There is no need to add Firestore to the providers array, since it is already globally provided. Also no need to import HttpClientModule, since we have provideHttpClient added globally.

TYPESCRIPT
@Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], standalone: true, providers: [], // <- notice! imports: [NgFor, FormsModule, MatFormFieldModule, MatSelectModule, MatAutocompleteModule, MatInputModule, // <- notice! ] // Include required modules }) export class AppComponent implements OnInit {

No comments yet.

Discussion

No comments yet.