Creando una aplicación de blog usando Angular y MongoDB: Inicio de sesión
Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)
Angular es un framework integral para crear aplicaciones móviles y web empleando el mismo código reutilizable. A través del uso de Angular puedes dividir toda la aplicación en componentes reutilizables, lo que facilita el mantenimiento y la reutilización de código.
En esta serie de tutoriales aprenderás cómo comenzar a crear una aplicación web usando Angular con MongoDB como back-end. Para ejecutar el servidor usarás Node.js.
A lo largo de este tutorial construirás una aplicación de blog utilizando Angular, Node.js y MongoDB.
En este tutorial verás cómo comenzar a configurar la aplicación y crear el componente Login (Inicio de sesión).
Primeros pasos
Vamos a comenzar instalando la CLI de Angular.
1 |
npm install -g @angular/cli |
Una vez que hayas instalado la CLI de Angular, crea una carpeta de proyecto llamada AngularBlogApp.
1 |
mkdir AngularBlogApp
|
2 |
cd AngularBlogApp
|
Desde la carpeta del proyecto, crea una nueva aplicación de Angular usando el siguiente comando:
1 |
ng new client |
Una vez que hayas creado la aplicación client (Cliente), navega a la carpeta del proyecto e instala las dependencias necesarias usando Node Package Manager (npm), o Administrador de Paquetes de Node.
1 |
cd client
|
2 |
npm install
|
Arranca el servidor cliente usando npm.
1 |
npm start |
La aplicación deberá ejecutarse en http://localhost:4200/.
Configurando la aplicación
Tu aplicación web de Angular tendrá un componente raíz (root). Crea una carpeta llamada root dentro del directorio src/app. Crea un archivo llamado root.component.html y agrega el siguiente código HTML:
1 |
<h3>
|
2 |
Root Component |
3 |
</h3>
|
Añade un archivo llamado root.component.ts y agrega el siguiente código:
1 |
import { Component } from '@angular/core'; |
2 |
|
3 |
@Component({ |
4 |
selector: 'app-root', |
5 |
templateUrl: './root.component.html' |
6 |
})
|
7 |
export class RootComponent { |
8 |
|
9 |
}
|
Elimina los archivos app.component.html, app.component.ts, app.component.scss y app.component.spec.ts. Tendrás solamente un archivo llamado app.module.ts dentro de la carpeta src/app.
Importa el RootComponent dentro del archivo app.module.ts.
1 |
import { RootComponent } from './root/root.component'; |
Incluye al RootComponent en ngModules y ejecútalo.
1 |
@NgModule({ |
2 |
declarations: [ |
3 |
RootComponent
|
4 |
],
|
5 |
imports: [ |
6 |
BrowserModule, |
7 |
FormsModule
|
8 |
],
|
9 |
providers: [], |
10 |
bootstrap: [RootComponent] |
11 |
})
|
Guarda los cambios y reinicia el servidor. Ahora el RootComponent aparecerá al cargar la aplicación.
Usaremos Router de Angular para el enrutamiento en nuestra aplicación de blog. Por lo tanto, importa las dependencias relacionadas con el enrutamiento en un nuevo archivo llamado app.routing.ts dentro del directorio src/app.
1 |
import { RouterModule, Routes } from '@angular/router'; |
2 |
import { ModuleWithProviders } from '@angular/core/src/metadata/ng_module'; |
Define la ruta del enrutamiento junto con los componentes como se muestra a continuación:
1 |
export const AppRoutes: Routes = [ |
2 |
{ path: '', component: LoginComponent } |
3 |
];
|
Exporta las rutas para crear un módulo con todos los proveedores de enrutamiento.
1 |
export const ROUTING: ModuleWithProviders = RouterModule.forRoot(AppRoutes); |
El archivo app.routing.ts se ve de esta forma:
1 |
import { RouterModule, Routes } from '@angular/router'; |
2 |
import { ModuleWithProviders } from '@angular/core/src/metadata/ng_module'; |
3 |
|
4 |
import { LoginComponent } from './login/login.component'; |
5 |
|
6 |
export const AppRoutes: Routes = [ |
7 |
{ path: '', component: LoginComponent } |
8 |
];
|
9 |
|
10 |
export const ROUTING: ModuleWithProviders = RouterModule.forRoot(AppRoutes); |
Como puedes ver en el código anterior, aún no has creado el LoginComponent. Éste se agrega para mayor claridad.
Importa la clase ROUTING en el archivo app.module.ts.
1 |
import { ROUTING } from './app.routing'; |
Inclúyela en la sección imports de NgModule.
1 |
imports: [ |
2 |
BrowserModule, |
3 |
ROUTING, |
4 |
FormsModule
|
5 |
]
|
Coloca RouterOutlet en la página root.component.html. Aquí es donde se representa el componente de la ruta.
1 |
<router-outlet></router-outlet>
|
Crea una carpeta llamada login dentro del directorio src/app. Dentro de la carpeta login, crea un archivo llamado login.component.ts y añade el siguiente código:
1 |
import { Component } from '@angular/core'; |
2 |
|
3 |
@Component({ |
4 |
selector: 'app-login', |
5 |
templateUrl: './login.component.html' |
6 |
})
|
7 |
export class LoginComponent { |
8 |
|
9 |
constructor() { |
10 |
|
11 |
}
|
12 |
|
13 |
}
|
Crea un archivo llamado login.component.html y agrega el siguiente código:
1 |
<h3>
|
2 |
Login Component |
3 |
</h3>
|
Guarda los cambios anteriores y reinicia el servidor. El LoginComponent será mostrado de acuerdo a las rutas definidas al cargar la aplicación.



Creando el Login Component (Componente de Inicio de sesión)
Ya has sentado las bases para el LoginComponent al configurar la aplicación. Vamos a crear la vista para el LoginComponent usando Bootstrap.
Descarga e incluye el estilo CSS de bootstrap en la carpeta assets e incluye la referencia en la página src/index.html.
1 |
<link rel="stylesheet" type="text/css" href="./assets/bootstrap.min.css"> |
Coloca un contenedor alrededor de app-root en la página index.html.
1 |
<div class="container"> |
2 |
<app-root></app-root> |
3 |
</div> |
Agrega el siguiente código HTML a la página login.component.html.
1 |
<form class="form-signin"> |
2 |
<h2 class="form-signin-heading">Please sign in</h2> |
3 |
<label for="inputEmail" class="sr-only">Email address</label> |
4 |
<input name="email" type="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus> |
5 |
<label for="inputPassword" class="sr-only">Password</label> |
6 |
<input name="password" type="password" id="inputPassword" class="form-control" placeholder="Password" required> |
7 |
<div class="checkbox"> |
8 |
<label>
|
9 |
<input type="checkbox" value="remember-me"> Remember me |
10 |
</label>
|
11 |
</div>
|
12 |
<button class="btn btn-lg btn-primary btn-block" type="button">Sign in</button> |
13 |
</form>
|
Crea un archivo llamado login.component.css dentro de la carpeta login y agrega el siguiente estilo CSS.
1 |
.form-signin { |
2 |
max-width: 330px; |
3 |
padding: 15px; |
4 |
margin: 0 auto; |
5 |
}
|
6 |
.form-signin .form-signin-heading, |
7 |
.form-signin .checkbox { |
8 |
margin-bottom: 10px; |
9 |
}
|
10 |
.form-signin .checkbox { |
11 |
font-weight: 400; |
12 |
}
|
13 |
.form-signin .form-control { |
14 |
position: relative; |
15 |
box-sizing: border-box; |
16 |
height: auto; |
17 |
padding: 10px; |
18 |
font-size: 16px; |
19 |
}
|
20 |
.form-signin .form-control:focus { |
21 |
z-index: 2; |
22 |
}
|
23 |
.form-signin input[type="email"] { |
24 |
margin-bottom: -1px; |
25 |
border-bottom-right-radius: 0; |
26 |
border-bottom-left-radius: 0; |
27 |
}
|
28 |
.form-signin input[type="password"] { |
29 |
margin-bottom: 10px; |
30 |
border-top-left-radius: 0; |
31 |
border-top-right-radius: 0; |
32 |
}
|
Modifica el decorador @Component para incluir el estilo CSS.
1 |
@Component({ |
2 |
selector: 'app-login', |
3 |
templateUrl: './login.component.html', |
4 |
styleUrls: ['./login.component.css'] |
5 |
})
|
Guarda los cambios anteriores e intenta cargar la aplicación. El LoginComponent aparecerá con la vista de inicio de sesión.



Creando el servicio de inicio de sesión
El LoginComponent necesitará interactuar con la base de datos para verificar si el usuario que inició sesión es válido o no. Por lo tanto necesitará hacer llamadas a APIs. Vamos a mantener la parte de interacción con la base de datos en un archivo separado llamado login.service.ts.
Crea un archivo llamado login.service.ts y agrega el siguiente código:
1 |
import { Injectable } from '@angular/core'; |
2 |
import { HttpClient } from '@angular/common/http'; |
3 |
|
4 |
@Injectable() |
5 |
export class LoginService { |
6 |
|
7 |
constructor(private http: HttpClient){ |
8 |
|
9 |
}
|
10 |
|
11 |
validateLogin(){ |
12 |
|
13 |
}
|
14 |
|
15 |
}
|
Importa el LoginService en el LoginComponent y agrégalo como proveedor en el decorador del componente.
1 |
import { LoginService } from './login.service'; |
1 |
@Component({ |
2 |
selector: 'app-login', |
3 |
templateUrl: './login.component.html', |
4 |
styleUrls: ['./login.component.css'], |
5 |
providers: [ LoginService ] |
6 |
})
|
Añade un método llamado validateLogin en el archivo login.service.ts que hará la llamada a la API. Esto se ve de la siguiente manera:
1 |
validateLogin(user: User){ |
2 |
return this.http.post('/api/user/login',{ |
3 |
username : user.username, |
4 |
password : user.password |
5 |
})
|
6 |
}
|
Como se observa en el código anterior, éste devuelve un observable que será suscrito en el archivo login.component.ts. El archivo login.service.ts se ve de la siguiente manera:
1 |
import { Injectable } from '@angular/core'; |
2 |
import { HttpClient } from '@angular/common/http'; |
3 |
import { User } from '../models/user.model'; |
4 |
|
5 |
@Injectable() |
6 |
export class LoginService { |
7 |
|
8 |
constructor(private http: HttpClient){ |
9 |
|
10 |
}
|
11 |
|
12 |
validateLogin(user: User){ |
13 |
return this.http.post('/api/user/login',{ |
14 |
username : user.username, |
15 |
password : user.password |
16 |
})
|
17 |
}
|
18 |
|
19 |
}
|
Implementando la validación de inicio de sesión de usuario
Agrega la directiva ngModel a los elementos de entrada en login.component.html.
1 |
<input name="email" [(ngModel)] = "user.username" type="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus> |
2 |
<input name="password" [(ngModel)] = "user.password" type="password" id="inputPassword" class="form-control" placeholder="Password" required> |
Agrega un evento click al botón de inicio de sesión.
1 |
<button class="btn btn-lg btn-primary btn-block" (click)="validateLogin();" type="button">Sign in</button> |
El archivo login.component.html modificado se ve de esta forma:
1 |
<form class="form-signin"> |
2 |
<h2 class="form-signin-heading">Please sign in</h2> |
3 |
<label for="inputEmail" class="sr-only">Email address</label> |
4 |
<input name="email" [(ngModel)] = "user.username" type="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus> |
5 |
<label for="inputPassword" class="sr-only">Password</label> |
6 |
<input name="password" [(ngModel)] = "user.password" type="password" id="inputPassword" class="form-control" placeholder="Password" required> |
7 |
<div class="checkbox"> |
8 |
<label>
|
9 |
<input type="checkbox" value="remember-me"> Remember me |
10 |
</label>
|
11 |
</div>
|
12 |
<button class="btn btn-lg btn-primary btn-block" (click)="validateLogin();" type="button">Sign in</button> |
13 |
</form>
|
Define e inicializa la variable del usuario en el archivo login.component.ts.
1 |
public user : User; |
2 |
|
3 |
constructor(private loginService: LoginService) { |
4 |
this.user = new User(); |
5 |
}
|
El modelo User ha sido definido en la carpeta src/app/models. A continación se muestra cómo se ve:
1 |
export class User { |
2 |
constructor(){ |
3 |
this.username = ''; |
4 |
this.password = ''; |
5 |
}
|
6 |
public username; |
7 |
public password; |
8 |
}
|
Define un método llamado validateLogin que será invocado cuando se haga clic en el botón. El método se ve de la siguiente manera:
1 |
validateLogin() { |
2 |
if(this.user.username && this.user.password) { |
3 |
this.loginService.validateLogin(this.user).subscribe(result => { |
4 |
console.log('result is ', result); |
5 |
}, error => { |
6 |
console.log('error is ', error); |
7 |
});
|
8 |
} else { |
9 |
alert('enter user name and password'); |
10 |
}
|
11 |
}
|
Cuando tanto el nombre de usuario como la contraseña hayan sido introducidos, el método validateLogin se suscribe al método LoginService para validar el inicio de sesión del usuario.
De esta manera se ve el archivo login.component.ts:
1 |
import { Component } from '@angular/core'; |
2 |
import { LoginService } from './login.service'; |
3 |
import { User } from '../models/user.model'; |
4 |
|
5 |
@Component({ |
6 |
selector: 'app-login', |
7 |
templateUrl: './login.component.html', |
8 |
styleUrls: ['./login.component.css'], |
9 |
providers: [ LoginService ] |
10 |
})
|
11 |
export class LoginComponent { |
12 |
|
13 |
public user : User; |
14 |
|
15 |
constructor(private loginService: LoginService) { |
16 |
this.user = new User(); |
17 |
}
|
18 |
|
19 |
validateLogin() { |
20 |
if(this.user.username && this.user.password) { |
21 |
this.loginService.validateLogin(this.user).subscribe(result => { |
22 |
console.log('result is ', result); |
23 |
}, error => { |
24 |
console.log('error is ', error); |
25 |
});
|
26 |
} else { |
27 |
alert('enter user name and password'); |
28 |
}
|
29 |
}
|
30 |
|
31 |
}
|
Concluyendo
En esta parte de la serie de tutoriales para crear una aplicación de blog en Angular viste cómo iniciar con la creación de una aplicación web usando Angular. Generaste la estructura básica de la aplicación de Angular y creaste el LoginComponent que permitirá al usuario validar su nombre de usuario y contraseña.
En la siguiente parte de esta serie de tutoriales escribirás la API REST para la validación del inicio de sesión del usuario y crearás el componente home.
El código fuente de este tutorial se encuentra disponible en GitHub.
Háznos llegar tus ideas y sugerencias en los comentarios a continuación.



