Angular 和 MongoDB:构建具有登录功能的博客应用程序

Angular 和 MongoDB:构建具有登录功能的博客应用程序

1. 简介

本文将介绍如何使用 Angular 和 MongoDB 构建具有登录功能的博客应用程序,您可以使用该应用程序在互联网上创建个人博客。 在这个教程中,我们将使用 Angular 作为前端框架、MongoDB 作为后端数据库,同时使用 Express.js 作为应用程序服务器.

2. 前置条件

2.1 安装 Angular CLI

打开命令行运行下面的命令来安装 Angular CLI:

npm install -g @angular/cli

安装完成之后,您可以使用下面的命令来检查安装是否成功:

ng version

2.2 安装 Node.js 和 MongoDB

要使用我们的应用程序,您需要安装 Node.js 和 MongoDB。 下载并安装 Node.jsMongoDB,然后按照官方文档进行相应的设置。

3. 创建应用程序

3.1 创建 Angular 项目

使用下面的命令来在本地创建一个名为 blog-app 的 Angular 项目:

ng new blog-app

现在,我们已经在本地创建了一个 Angular 项目。

3.2 安装必需的依赖项

进入 blog-app 项目并使用下面的命令来安装必需的依赖项:

cd blog-app

npm install --save express body-parser mongoose jsonwebtoken bcryptjs

这里我们的应用程序需要使用的依赖项。

3.3 创建后端 API

我们将创建一个名为 server.js 的文件来处理应用程序的后端 API。在项目的根目录下创建 server.js 文件:

touch server.js

然后使用下面的代码将 server.js 文件填充:

const express = require('express');

const bodyParser = require('body-parser');

const mongoose = require('mongoose');

const bcrypt = require('bcryptjs');

const jwt = require('jsonwebtoken');

const app = express();

const PORT = 3000;

app.use(bodyParser.json());

// Connect to MongoDB database

mongoose.connect('mongodb://localhost:27017/blog-app', { useNewUrlParser: true, useUnifiedTopology: true });

mongoose.connection.on('connected', () => {

console.log('Connected to MongoDB!');

});

// Define user schema

const userSchema = new mongoose.Schema({

email: { type: String, unique: true },

password: { type: String, required: true }

});

// Define user model

const User = mongoose.model('User', userSchema);

// Create user

app.post('/api/users', (req, res) => {

const salt = bcrypt.genSaltSync(10);

const hash = bcrypt.hashSync(req.body.password, salt);

const user = new User({

email: req.body.email,

password: hash

});

user.save((err) => {

if (err) {

return res.status(400).json({ message: 'Error creating user' });

}

return res.status(201).json({ message: 'User created' });

});

});

// Login user

app.post('/api/login', (req, res) => {

User.findOne({ email: req.body.email }, (err, user) => {

if (err) {

return res.status(400).json({ message: 'Error finding user' });

}

if (!user) {

return res.status(401).json({ message: 'Invalid email or password' });

}

const validPassword = bcrypt.compareSync(req.body.password, user.password);

if (!validPassword) {

return res.status(401).json({ message: 'Invalid email or password' });

}

const token = jwt.sign({ email: req.body.email }, 'my-secret-key');

return res.status(200).json({ token: token });

});

});

// Start server

app.listen(PORT, () => {

console.log(`Server running on port ${PORT}`);

});

这里我们定义了一个 Express 应用程序并创建了两个端点,用于创建用户和用户登录。 我们使用 bcryptjs 和 jsonwebtoken 库来处理用户密码的哈希和 JSON Web Token。 请注意,我们在 MongoDB 数据库中定义了一个 User 模型,并在每次用户注册时将其保存在数据库中。

3.4 创建前端组件

我们将创建三个组件:登录、注册和主页。 在命令行中使用下面的命令创建这些组件:

ng generate component login

ng generate component register

ng generate component home

现在,我们在项目的 src/app 目录下创建了三个组件。

4. 集成后端和前端

我们已经创建了一个后端代码,将其连接到前端代码,使我们的应用程序正常工作。 在这里,我们将使用 Angular 服务将前端代码连接到后端 API。

4.1 创建服务

在命令行中使用下面的命令创建名为 auth.service.ts 的 Angular 服务:

ng generate service auth

现在,我们在项目的 src/app 目录下创建了一个 Angular 服务。

我们创建了一个 AuthService 类来处理登录、注册和退出登录等任务。 用下面的代码替换 auth.service.ts 文件的内容:

import { Injectable } from '@angular/core';

import { HttpClient } from '@angular/common/http';

@Injectable({

providedIn: 'root'

})

export class AuthService {

private registerUrl = '/api/users';

private loginUrl = '/api/login';

constructor(private http: HttpClient) { }

register(user) {

return this.http.post<any>(this.registerUrl, user);

}

login(user) {

return this.http.post<any>(this.loginUrl, user);

}

loggedIn() {

return !!localStorage.getItem('token');

}

getToken() {

return localStorage.getItem('token');

}

logout() {

localStorage.removeItem('token');

}

}

在此服务中,我们将创建注册、登录、退出登录等方法。

4.2 更新组件

现在,我们将更新我们的组件以使用 AuthService。

用下面的代码替换 login.component.ts:

import { Component, OnInit } from '@angular/core';

import { FormBuilder, FormGroup, Validators } from '@angular/forms';

import { Router } from '@angular/router';

import { AuthService } from '../auth.service';

@Component({

selector: 'app-login',

templateUrl: './login.component.html',

styleUrls: ['./login.component.css']

})

export class LoginComponent implements OnInit {

loginForm: FormGroup;

message: string;

constructor(private authService: AuthService, private formBuilder: FormBuilder, private router: Router) { }

ngOnInit() {

this.loginForm = this.formBuilder.group({

email: ['', [Validators.required, Validators.email]],

password: ['', Validators.required]

});

}

onSubmit() {

this.authService.login(this.loginForm.value).subscribe(

(res) => {

localStorage.setItem('token', res.token);

this.router.navigate(['home']);

},

(err) => {

this.message = err.error.message;

}

);

}

}

然后用下面的代码替换 register.component.ts:

import { Component, OnInit } from '@angular/core';

import { FormBuilder, FormGroup, Validators } from '@angular/forms';

import { Router } from '@angular/router';

import { AuthService } from '../auth.service';

@Component({

selector: 'app-register',

templateUrl: './register.component.html',

styleUrls: ['./register.component.css']

})

export class RegisterComponent implements OnInit {

registerForm: FormGroup;

message: string;

constructor(private authService: AuthService, private formBuilder: FormBuilder, private router: Router) { }

ngOnInit() {

this.registerForm = this.formBuilder.group({

email: ['', [Validators.required, Validators.email]],

password: ['', Validators.required]

});

}

onSubmit() {

this.authService.register(this.registerForm.value).subscribe(

(res) => {

this.router.navigate(['login']);

},

(err) => {

this.message = err.error.message;

}

);

}

}

然后用下面的代码替换 home.component.ts:

import { Component, OnInit } from '@angular/core';

import { AuthService } from '../auth.service';

@Component({

selector: 'app-home',

templateUrl: './home.component.html',

styleUrls: ['./home.component.css']

})

export class HomeComponent implements OnInit {

constructor(private authService: AuthService) { }

ngOnInit() {

}

logout() {

this.authService.logout();

}

isLoggedIn() {

return this.authService.loggedIn();

}

}

4.3 更新模板

现在,我们将更新我们的模板以使用 AuthService。

用下面的代码替换 login.component.html:

<form class="form-signin" [formGroup]="loginForm" (ngSubmit)="onSubmit()">

<h1 class="h3 mb-3 font-weight-normal">Please sign in</h1>

<div *ngIf="message" class="alert alert-danger">{{ message }}</div>

<label for="inputEmail" class="sr-only">Email address</label>

<input type="email" id="inputEmail" class="form-control" placeholder="Email address" [formControl]="loginForm.get('email')" required autofocus>

<label for="inputPassword" class="sr-only">Password</label>

<input type="password" id="inputPassword" class="form-control" placeholder="Password" [formControl]="loginForm.get('password')" required>

<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>>

Don't have an account? <a routerLink="/register">Register</a>

</form>

然后用下面的代码替换 register.component.html:

<form class="form-signin" [formGroup]="registerForm" (ngSubmit)="onSubmit()">

<h1 class="h3 mb-3 font-weight-normal">Please register</h1>

<div *ngIf="message" class="alert alert-danger">{{ message }}</div>

<label for="inputEmail" class="sr-only">Email address</label>

<input type="email" id="inputEmail" class="form-control" placeholder="Email address" [formControl]="registerForm.get('email')" required autofocus>

<label for="inputPassword" class="sr-only">Password</label>

<input type="password" id="inputPassword" class="form-control" placeholder="Password" [formControl]="registerForm.get('password')" required>

<button class="btn btn-lg btn-primary btn-block" type="submit">Register</button>

Already have an account? <a routerLink="/login">Login</a>

</form>

然后用下面的代码替换 home.component.html:

<h1 class="mt-5">Welcome to your blog!</h1>

<p *ngIf="isLoggedIn()">You're logged in. <button (click)="logout()" class="btn btn-danger">Logout</button>

<p *ngIf="!isLoggedIn()">Please <a routerLink="/login">login</a> or <a routerLink="/register">register</a>.

5. 运行应用程序

最后,我们将在本地启动我们的应用程序并检查它是否正在运行。 在命令行中使用下面的命令启动本地服务器:

npm start

现在,在浏览器中打开 http://localhost:4200,注册一个新账户,然后使用该账户登录到您的博客页面。 现在您可以开始使用您的博客啦!

总结

在本文中,我们使用 Angular 和 MongoDB 创建了一个具有登录功能的博客应用程序。 我们使用了 Angular CLI 快速生成项目和组件,并使用 Express.js 处理后端 API。 使用 bcryptjs 和 jsonwebtoken 库,我们可以安全地处理用户密码和 JSON Web Token。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。