Unit 5 Integration
Unit 5 Integration
js API
1. Set Up the Express.js Backend
Make sure your Express.js API is running and serving data correctly.
CORS is required to allow requests from your Angular app running on a different
port.
@NgModule({
declarations: [],
imports: [
BrowserModule,
HttpClientModule // Import HttpClientModule for API calls
],
providers: [],
bootstrap: []
})
export class AppModule { }
5. Create Angular Service for API Calls
@Injectable({
providedIn: 'root'
})
export class ApiService {
private apiUrl = 'http://localhost:5000/api/data'; // Backend API URL
getData(): Observable<any> {
return this.http.get<any>(this.apiUrl);
}
}
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
data: any;
ngOnInit() {
this.apiService.getData().subscribe(response => {
this.data = response;
});
}
}
Ensure your Express.js backend is running on port 5000 and Angular frontend
is running on port 4200.
javascript
const mongoose = require("mongoose");
// Register User
router.post("/register", async (req, res) => {
const { name, email, password } = req.body;
try {
let user = await User.findOne({ email });
if (user) return res.status(400).json({ message: "User already exists" });
await user.save();
res.status(201).json({ message: "User registered successfully" });
} catch (err) {
res.status(500).json({ message: "Server error" });
}
});
// Login User
router.post("/login", async (req, res) => {
const { email, password } = req.body;
try {
const user = await User.findOne({ email });
if (!user) return res.status(400).json({ message: "User not found" });
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) return res.status(400).json({ message: "Invalid credentials" });
module.exports = router;
Create middleware/auth.js:
req.user = decoded;
next();
} catch (err) {
};
In server.js:
dotenv.config();
app.use(express.json());
app.use(cors());
mongoose.connect("mongodb://localhost:27017/mean_auth", { useNewUrlParser:
true, useUnifiedTopology: true });
});
providedIn: 'root'
})
saveToken(token: string) {
localStorage.setItem('token', token);
isAuthenticated(): boolean {
return !!this.getToken();
logout() {
localStorage.removeItem('token');
Login Component
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
})
password = '';
login() {
this.authService.saveToken(res.token);
alert('Login successful');
},
);
Login HTML
<form (ngSubmit)="login()">
<button type="submit">Login</button>
</form>
Modify app-routing.module.ts:
@Injectable({
providedIn: 'root'
})
canActivate(): boolean {
if (!this.authService.isAuthenticated()) {
this.router.navigate(['/login']);
return false;
return true;
}
}
];
Create auth.interceptor.ts:
@Injectable()
if (token) {
return next.handle(cloned);
return next.handle(req);
providers: [
app.use(express.json());
app.use(cors());
socket.service.ts
@Injectable({
providedIn: 'root'
})
export class SocketService {
private socket: Socket;
private SERVER_URL = 'http://localhost:5000';
constructor() {
this.socket = io(this.SERVER_URL);
}
chat.component.ts
@Component({
selector: 'app-chat',
templateUrl: './chat.component.html',
styleUrls: ['./chat.component.css']
})
messageInput = '';
ngOnInit() {
this.messages.push(message);
});
sendMessage() {
if (this.messageInput.trim()) {
this.socketService.sendMessage(this.messageInput);
this.messageInput = '';
ngOnDestroy() {
this.socketService.disconnect();
<h2>Chat Room</h2>
<div class="chat-box">
</div>
<button (click)="sendMessage()">Send</button>
.chat-box {
width: 100%;
max-height: 300px;
overflow-y: auto;
padding: 10px;
margin-bottom: 10px;
input {
width: 80%;
padding: 5px;
button {
padding: 5px 10px;
cursor: pointer;
node server.js
ng serve
module.exports = errorHandler;
// Routes
app.use("/auth", require("./routes/auth"));
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler) {
return next.handle(req).pipe(
catchError((error: HttpErrorResponse) => {
let errorMessage = 'An unknown error occurred!';
if (error.error.message) {
errorMessage = error.error.message;
} else if (error.status === 0) {
errorMessage = 'Network error! Please check your connection.';
}
Modify app.module.ts:
providers: [
{ provide: HTTP_INTERCEPTORS, useClass:
ErrorInterceptor, multi: true }
]
"scripts": {
"test": "jest"
},
"jest": {
"testEnvironment": "node"
}
Create tests/auth.test.js:
expect(res.statusCode).toEqual(404);
expect(res.body.message).toEqual("User not found");
});
});
Modify auth.service.spec.ts:
describe('AuthService', () => {
let service: AuthService;
let httpMock: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [AuthService]
});
service = TestBed.inject(AuthService);
httpMock = TestBed.inject(HttpTestingController);
});
const req =
httpMock.expectOne('http://localhost:5000/auth/login');
expect(req.request.method).toBe('POST');
req.flush(mockResponse);
});
afterEach(() => {
httpMock.verify();
});
});