Rumah  >  Artikel  >  hujung hadapan web  >  Bina halaman utama aplikasi blog menggunakan Angular dan MongoDB

Bina halaman utama aplikasi blog menggunakan Angular dan MongoDB

WBOY
WBOYasal
2023-09-03 23:49:011110semak imbas

Dalam bahagian pertama siri tutorial ini, anda mempelajari cara mula membuat aplikasi web Angular. Anda belajar cara menyediakan aplikasi dan mencipta komponen log masuk.

Dalam bahagian siri ini, anda akan menulis lagi REST API yang diperlukan untuk berinteraksi dengan bahagian perbankan MongoDB. Anda juga akan mencipta komponen Home yang akan dipaparkan selepas pengguna berjaya log masuk. Home 组件,该组件将在用户成功登录后显示。

开始使用

让我们开始克隆本教程系列第一部分的源代码。

git clone https://github.com/royagasthyan/AngularBlogApp-Login AngularBlogApp-Home

导航到项目目录并安装所需的依赖项。

cd AngularBlogApp-Home/client
npm install

安装依赖项后,重新启动应用程序服务器。

npm start

将浏览器指向 http://localhost:4200,应用程序应该正在运行。

创建登录 REST API

在项目文件夹 AngularBlogApp-Home 中,创建另一个名为 server 的文件夹。您将使用 Node.js 编写 REST API。

导航到 server 文件夹并初始化项目。

cd server
npm init

输入所需的详细信息,您应该已初始化项目。

您将使用 Express 框架来创建服务器。使用以下命令安装 Express

npm install express --save

安装 Express 后,创建一个名为 app.js 的文件。这将是 Node.js 服务器的根文件。

以下是 app.js 文件的外观:

const express = require('express')
const app = express()

app.get('/api/user/login', (req, res) => {
    res.send('Hello World!')
})

app.listen(3000, () => console.log('blog server running on port 3000!'))

如上面的代码所示,您将 express 导入到 app.js 中。使用 express,您创建了一个应用程序 app

使用 app,您公开了一个端点 /api/user/login ,它将显示一条消息。使用以下命令启动 Node.js 服务器:

node app.js

将浏览器指向 http://localhost:3000/api/user/login,您应该会显示该消息。

您将使用 用户名 密码 参数从 Angular 服务向服务器发出 POST 请求。所以需要解析请求参数。

安装 body-parser,这是 Node.js 正文解析中间件,用于解析请求参数。

npm install body-parser --save

安装完成后,将其导入 app.js

const bodyParser = require('body-parser')

将以下代码添加到 app.js 文件中。

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended : false}))

上述两个 body-parser 选项返回仅解析 jsonurlencoded 主体的中间件,并且仅查看 Content-Type 标头匹配的请求type 选项。

您将使用 Mongoose 与 Node.js 中的 MongoDB 进行交互。因此,使用节点包管理器(npm)安装 Mongoose

npm install mongoose --save

安装 mongoose 后,将其导入 app.js

const mongoose = require('mongoose');

app.js 中定义 MongoDB 数据库 URL。

const url = 'mongodb://localhost/blogDb';

让我们使用 Mongoose 连接到 MongoDB 数据库。其外观如下:

app.post('/api/user/login', (req, res) => {
    mongoose.connect(url, function(err){
		if(err) throw err;
		console.log('connected successfully, username is ',req.body.username,' password is ',req.body.password);
	});
})

如果建立了连接,该消息将与 用户名 密码 一起记录。

以下是 app.js 文件的外观:

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
const mongoose = require('mongoose');
const url = 'mongodb://localhost/blogDb';

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended : false}))

app.post('/api/user/login', (req, res) => {
    mongoose.connect(url, function(err){
    	if(err) throw err;
		console.log('connected successfully, username is ',req.body.username,' password is ',req.body.password);
	});
})

app.listen(3000, () => console.log('blog server running on port 3000!'))

使用以下命令重新启动节点服务器:

node app.js

要从 Angular 应用程序连接到 Node 服务器,您需要设置代理。在 client/src 文件夹中创建一个名为 proxy.json 的文件。其外观如下:

{
    "/api/*": {
		"target": "http://localhost:3000",
		"secure": "false"
	}
}

修改客户端package.json文件以使用代理文件启动应用程序。

"start": "ng serve --proxy-config proxy.json"

保存更改并启动客户端服务器。

npm start

将浏览器指向 http://localhost:4200 并输入用户名和密码。单击登录按钮,您应该将参数记录到节点控制台中。

验证用户登录

要使用 Mongoose 与 MongoDB 交互,您需要定义架构并创建模型。在 server 文件夹内,创建一个名为 model 的文件夹。

model 文件夹内创建一个名为 user.js 的文件。将以下代码添加到 user.js 文件:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// create a schema
const userSchema = new Schema({
  username: { type: String, required: true, unique: true },
  password: { type: String, required: true },
  name: { type: String }
}, { collection : 'user' });

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

module.exports = User;

如上面的代码所示,您将 mongoose 导入到 user.js 中。您使用 mongoose schema 创建了 userSchema,并使用 mongoose 模型创建了 User

Mulakan

Mari mulakan pengklonan kod sumber untuk bahagian pertama siri tutorial ini. 🎜
const User = require('./model/user');
🎜 Navigasi ke direktori projek dan pasang kebergantungan yang diperlukan. 🎜
db.createCollection('user')
🎜Selepas memasang kebergantungan, mulakan semula pelayan aplikasi. 🎜
 db.user.insert({
     name: 'roy agasthyan',
     username: 'roy',
     password: '123'
 })
🎜Tuding pelayar anda ke http://localhost:4200 dan aplikasi sepatutnya berjalan. 🎜

Buat log masuk REST API

🎜Dalam folder projek AngularBlogApp-Home, buat folder lain bernama server. Anda akan menulis API REST menggunakan Node.js. 🎜 🎜 Navigasi ke folder server dan mulakan projek. 🎜
app.post('/api/user/login', (req, res) => {
    mongoose.connect(url,{ useMongoClient: true }, function(err){
		if(err) throw err;
		User.find({
			username : req.body.username, password : req.body.password
		}, function(err, user){
			if(err) throw err;
			if(user.length === 1){	
				return res.status(200).json({
					status: 'success',
					data: user
				})
			} else {
				return res.status(200).json({
					status: 'fail',
					message: 'Login Failed'
				})
			}
			
		})
	});
})
🎜Masukkan butiran yang diperlukan dan anda sepatutnya memulakan projek anda. 🎜 🎜Anda akan menggunakan rangka kerja Express untuk mencipta pelayan. Pasang Express menggunakan arahan berikut: 🎜
<header class="header clearfix">
    <nav>
        <ul class="nav nav-pills float-right">
            <li class="nav-item">
                <a class="nav-link active" href="#">Home <span class="sr-only">(current)</span></a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Add</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Logout</a>
            </li>
        </ul>
    </nav>
    <h3 class="text-muted">Angular Blog App</h3>
</header>

<main role="main">

    <div class="jumbotron">
        <h1 class="display-3">Lorem ipsum</h1>
        <p class="lead">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
        <p><a class="btn btn-lg btn-success" href="#" role="button">Read More ...</a></p>
    </div>

    <div class="row marketing">
        <div class="col-lg-6">
            <h4>Subheading</h4>
            <p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p>

            <h4>Subheading</h4>
            <p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p>

            <h4>Subheading</h4>
            <p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p>
        </div>

        <div class="col-lg-6">
            <h4>Subheading</h4>
            <p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p>

            <h4>Subheading</h4>
            <p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p>

            <h4>Subheading</h4>
            <p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p>
        </div>
    </div>

</main>

<footer class="footer">
    <p>&copy; Company 2017</p>
</footer>
🎜Selepas memasang Express, buat fail bernama app.js. Ini akan menjadi fail akar pelayan Node.js. 🎜 🎜Beginilah rupa fail app.js: 🎜
.header,
.marketing,
.footer {
  padding-right: 1rem;
  padding-left: 1rem;
}

/* Custom page header */
.header {
  padding-bottom: 1rem;
  border-bottom: .05rem solid #e5e5e5;
}

.header h3 {
  margin-top: 0;
  margin-bottom: 0;
  line-height: 3rem;
}

/* Custom page footer */
.footer {
  padding-top: 1.5rem;
  color: #777;
  border-top: .05rem solid #e5e5e5;
}

/* Customize container */
@media (min-width: 48em) {
  .container {
    max-width: 46rem;
  }
}
.container-narrow > hr {
  margin: 2rem 0;
}

/* Main marketing message and sign up button */
.jumbotron {
  text-align: center;
  border-bottom: .05rem solid #e5e5e5;
}
.jumbotron .btn {
  padding: .75rem 1.5rem;
  font-size: 1.5rem;
}

/* Supporting marketing content */
.marketing {
  margin: 3rem 0;
}
.marketing p + h4 {
  margin-top: 1.5rem;
}

/* Responsive: Portrait tablets and up */
@media screen and (min-width: 48em) {
  /* Remove the padding we set earlier */
  .header,
  .marketing,
  .footer {
    padding-right: 0;
    padding-left: 0;
  }

  /* Space out the masthead */
  .header {
    margin-bottom: 2rem;
  }

  .jumbotron {
    border-bottom: 0;
  }
}
🎜Seperti yang ditunjukkan dalam kod di atas, anda mengimport express ke dalam app.js. Menggunakan express, anda membuat aplikasi app. 🎜 🎜Dengan app, anda mendedahkan titik akhir /api/user/login yang akan memaparkan mesej. Mulakan pelayan Node.js menggunakan arahan berikut: 🎜
import { Component } from '@angular/core';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent {
  
}
🎜Tuding pelayar anda ke http://localhost:3000/api/user/login dan anda akan melihat mesej itu. 🎜 🎜Anda akan membuat POSTdaripada perkhidmatan Angular ke pelayan menggunakan Nama Pengguna dan Kata Laluan parameter kod>. Jadi parameter permintaan perlu dihuraikan. 🎜 🎜Pasang <code class="inline">body-parser, iaitu perisian tengah penghuraian badan Node.js untuk parameter permintaan penghuraian. 🎜
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ROUTING } from './app.routing';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';

import { RootComponent } from './root/root.component';
import { LoginComponent } from './login/login.component';
import { HomeComponent } from './home/home.component';


@NgModule({
  declarations: [
      RootComponent,
    LoginComponent,
    HomeComponent
  ],
  imports: [
    BrowserModule,
    ROUTING,
    FormsModule,
    HttpClientModule
  ],
  providers: [],
  bootstrap: [RootComponent]
})
export class AppModule { }
🎜Selepas pemasangan selesai, importnya ke dalam app.js . 🎜
import { RouterModule, Routes } from '@angular/router';
import { ModuleWithProviders } from '@angular/core/src/metadata/ng_module';

import { LoginComponent } from './login/login.component';
import { HomeComponent } from './home/home.component';

export const AppRoutes: Routes = [
    { path: '', component: LoginComponent },
	{ path: 'home', component: HomeComponent }
];

export const ROUTING: ModuleWithProviders = RouterModule.forRoot(AppRoutes);
🎜Tambahkan kod berikut pada fail app.js. 🎜
import { Router } from '@angular/router';
🎜Dua pilihan body-parser di atas mengembalikan middleware yang hanya menghuraikan badan json dan urlencoded, Dan hanya lihat permintaan yang pengepala Content-Typenya sepadan dengan pilihan type. 🎜 🎜Anda akan menggunakan Mongoose untuk berinteraksi dengan MongoDB dalam Node.js. Oleh itu, pasang Mongoose menggunakan pengurus pakej nod (npm). 🎜
if(result['status'] === 'success') {
  this.router.navigate(['/home']);
} else {
  alert('Wrong username password');
}
🎜Selepas memasang luwak, import ia ke dalam app.js. 🎜
import { Component } from '@angular/core';
import { LoginService } from './login.service';
import { User } from '../models/user.model';
import { Router } from '@angular/router';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css'],
  providers: [ LoginService ]
})
export class LoginComponent {

  public user : User;

  constructor(private loginService: LoginService, private router: Router) {
      this.user = new User();
  }

  validateLogin() {
  	if(this.user.username && this.user.password) {
  		this.loginService.validateLogin(this.user).subscribe(result => {
        console.log('result is ', result);
        if(result['status'] === 'success') {
          this.router.navigate(['/home']);
        } else {
          alert('Wrong username password');
        }
        
      }, error => {
        console.log('error is ', error);
      });
  	} else {
  		alert('enter user name and password');
  	}
  }

}
🎜Tentukan URL pangkalan data MongoDB dalam app.js. 🎜 rrreee 🎜Mari gunakan Mongoose untuk menyambung ke pangkalan data MongoDB. Ia kelihatan seperti ini: 🎜 rrreee 🎜Jika sambungan diwujudkan, mesej akan dilog bersama dengan nama pengguna dan kata laluan . 🎜 🎜Beginilah rupa fail app.js: 🎜 rrreee 🎜Mulakan semula pelayan nod menggunakan arahan berikut: 🎜 rrreee 🎜Untuk menyambung ke pelayan Nod daripada aplikasi Angular, anda perlu menyediakan proksi. Buat fail bernama proxy.json dalam folder client/src. Ia kelihatan seperti ini: 🎜 rrreee 🎜Ubah suai fail package.json klien untuk menggunakan fail proksi untuk melancarkan aplikasi. 🎜 rrreee 🎜Simpan perubahan dan mulakan pelayan pelanggan. 🎜 rrreee 🎜Arahkan pelayar anda ke http://localhost:4200 dan masukkan nama pengguna dan kata laluan anda. Klik butang log masuk dan anda harus log parameter ke dalam konsol nod. 🎜

Sahkan log masuk pengguna

🎜Untuk menggunakan Mongoose untuk berinteraksi dengan MongoDB, anda perlu mentakrifkan skema dan mencipta model. Dalam folder server, buat folder bernama model. 🎜 🎜Buat fail bernama user.js di dalam folder model. Tambahkan kod berikut pada fail user.js: 🎜 rrreee 🎜Seperti yang ditunjukkan dalam kod di atas, anda mengimport mongoose ke dalam user.js. Anda membuat userSchema menggunakan luwak skema dan model mongoose Pengguna model. 🎜

user.js 文件导入到 app.js 文件中。

const User = require('./model/user');

在查询 MongoDB user 集合之前,您需要创建该集合。输入 mongo 转到 MongoDB shell。使用以下命令创建集合 user

db.createCollection('user')

插入您要查询的记录。

 db.user.insert({
     name: 'roy agasthyan',
     username: 'roy',
     password: '123'
 })

现在,一旦 mongoose 连接到 MongoDB,您将使用传入的 用户名 密码 从数据库中找到记录。API 如下所示:

app.post('/api/user/login', (req, res) => {
    mongoose.connect(url,{ useMongoClient: true }, function(err){
		if(err) throw err;
		User.find({
			username : req.body.username, password : req.body.password
		}, function(err, user){
			if(err) throw err;
			if(user.length === 1){	
				return res.status(200).json({
					status: 'success',
					data: user
				})
			} else {
				return res.status(200).json({
					status: 'fail',
					message: 'Login Failed'
				})
			}
			
		})
	});
})

如上面的代码所示,一旦收到数据库的响应,就会将其返回给客户端。

保存以上更改并尝试运行客户端和服务器。输入用户名 roy 和密码 123 ,您应该能够在浏览器控制台中查看结果。

重定向到主页组件

用户验证成功后,您需要将用户重定向到 Home 组件。因此,让我们首先创建 Home 组件。

src/app 文件夹中创建一个名为 Home 的文件夹。创建一个名为 home.component.html 的文件并添加以下 HTML 代码:

<header class="header clearfix">
    <nav>
        <ul class="nav nav-pills float-right">
            <li class="nav-item">
                <a class="nav-link active" href="#">Home <span class="sr-only">(current)</span></a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Add</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Logout</a>
            </li>
        </ul>
    </nav>
    <h3 class="text-muted">Angular Blog App</h3>
</header>

<main role="main">

    <div class="jumbotron">
        <h1 class="display-3">Lorem ipsum</h1>
        <p class="lead">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
        <p><a class="btn btn-lg btn-success" href="#" role="button">Read More ...</a></p>
    </div>

    <div class="row marketing">
        <div class="col-lg-6">
            <h4>Subheading</h4>
            <p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p>

            <h4>Subheading</h4>
            <p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p>

            <h4>Subheading</h4>
            <p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p>
        </div>

        <div class="col-lg-6">
            <h4>Subheading</h4>
            <p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p>

            <h4>Subheading</h4>
            <p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p>

            <h4>Subheading</h4>
            <p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p>
        </div>
    </div>

</main>

<footer class="footer">
    <p>&copy; Company 2017</p>
</footer>

创建一个名为 home.component.css 的文件并添加以下 CSS 样式:

.header,
.marketing,
.footer {
  padding-right: 1rem;
  padding-left: 1rem;
}

/* Custom page header */
.header {
  padding-bottom: 1rem;
  border-bottom: .05rem solid #e5e5e5;
}

.header h3 {
  margin-top: 0;
  margin-bottom: 0;
  line-height: 3rem;
}

/* Custom page footer */
.footer {
  padding-top: 1.5rem;
  color: #777;
  border-top: .05rem solid #e5e5e5;
}

/* Customize container */
@media (min-width: 48em) {
  .container {
    max-width: 46rem;
  }
}
.container-narrow > hr {
  margin: 2rem 0;
}

/* Main marketing message and sign up button */
.jumbotron {
  text-align: center;
  border-bottom: .05rem solid #e5e5e5;
}
.jumbotron .btn {
  padding: .75rem 1.5rem;
  font-size: 1.5rem;
}

/* Supporting marketing content */
.marketing {
  margin: 3rem 0;
}
.marketing p + h4 {
  margin-top: 1.5rem;
}

/* Responsive: Portrait tablets and up */
@media screen and (min-width: 48em) {
  /* Remove the padding we set earlier */
  .header,
  .marketing,
  .footer {
    padding-right: 0;
    padding-left: 0;
  }

  /* Space out the masthead */
  .header {
    margin-bottom: 2rem;
  }

  .jumbotron {
    border-bottom: 0;
  }
}

创建名为 home.component.ts 的组件文件并添加以下代码:

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

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent {
  
}

如上面的代码所示,您刚刚使用 @Component 装饰器创建了 HomeComponent 并指定了 选择器 , templateUrlstyleUrls

HomeComponent 添加到 NgModules 中的 app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ROUTING } from './app.routing';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';

import { RootComponent } from './root/root.component';
import { LoginComponent } from './login/login.component';
import { HomeComponent } from './home/home.component';


@NgModule({
  declarations: [
      RootComponent,
    LoginComponent,
    HomeComponent
  ],
  imports: [
    BrowserModule,
    ROUTING,
    FormsModule,
    HttpClientModule
  ],
  providers: [],
  bootstrap: [RootComponent]
})
export class AppModule { }

app.routing.ts中导入HomeComponent,并为home定义路由。

import { RouterModule, Routes } from '@angular/router';
import { ModuleWithProviders } from '@angular/core/src/metadata/ng_module';

import { LoginComponent } from './login/login.component';
import { HomeComponent } from './home/home.component';

export const AppRoutes: Routes = [
    { path: '', component: LoginComponent },
	{ path: 'home', component: HomeComponent }
];

export const ROUTING: ModuleWithProviders = RouterModule.forRoot(AppRoutes);

login.component.ts 文件中的 validateLogin 方法中,成功验证后会将用户重定向到 HomeComponent。要重定向,您需要导入 Angular Router

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

如果 API 调用的响应成功,您将使用 Angular Router 导航到 HomeComponent

if(result['status'] === 'success') {
  this.router.navigate(['/home']);
} else {
  alert('Wrong username password');
}

以下是 login.component.ts 文件的外观:

import { Component } from '@angular/core';
import { LoginService } from './login.service';
import { User } from '../models/user.model';
import { Router } from '@angular/router';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css'],
  providers: [ LoginService ]
})
export class LoginComponent {

  public user : User;

  constructor(private loginService: LoginService, private router: Router) {
      this.user = new User();
  }

  validateLogin() {
  	if(this.user.username && this.user.password) {
  		this.loginService.validateLogin(this.user).subscribe(result => {
        console.log('result is ', result);
        if(result['status'] === 'success') {
          this.router.navigate(['/home']);
        } else {
          alert('Wrong username password');
        }
        
      }, error => {
        console.log('error is ', error);
      });
  	} else {
  		alert('enter user name and password');
  	}
  }

}

保存以上更改并重新启动服务器。使用现有的用户名和密码登录应用程序,您将被重定向到 HomeComponent

使用 Angular 和 MongoDB 构建博客应用程序主页

总结

在本教程中,您了解了如何编写用于用户登录的 REST API 端点。您学习了如何使用 Mongoose 从 Node.js 与 MongoDB 进行交互。成功验证后,您了解了如何使用 Angular Router 导航到 HomeComponent

您学习编写 Angular 应用程序及其后端的体验如何?请在下面的评论中告诉我们您的想法和建议。

本教程的源代码可在 GitHub 上获取。

Atas ialah kandungan terperinci Bina halaman utama aplikasi blog menggunakan Angular dan MongoDB. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:PenilaianArtikel seterusnya:Penilaian