在本教學系列的第一部分中,您了解如何開始建立 Angular Web 應用程式。您學習如何設定應用程式並建立登入元件。
在本系列的這一部分中,您將進一步寫下與 MongoDB 銀行端互動所需的 REST API。您還將建立 Home
元件,該元件將在使用者成功登入後顯示。
讓我們開始複製本教學系列第一部分的原始碼。
git clone https://github.com/royagasthyan/AngularBlogApp-Login AngularBlogApp-Home
導航到專案目錄並安裝所需的依賴項。
cd AngularBlogApp-Home/client npm install
安裝依賴項後,重新啟動應用程式伺服器。
npm start
將瀏覽器指向 http://localhost:4200,應用程式應該正在執行。
在專案資料夾 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
選項傳回僅解析json
和urlencoded
主體的中間件,並且只查看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
模型。
将 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>© 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
并指定了 选择器
, templateUrl
和 styleUrls
。
将 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
。
在本教程中,您了解了如何编写用于用户登录的 REST API 端点。您学习了如何使用 Mongoose
从 Node.js 与 MongoDB 进行交互。成功验证后,您了解了如何使用 Angular Router
导航到 HomeComponent
。
您学习编写 Angular 应用程序及其后端的体验如何?请在下面的评论中告诉我们您的想法和建议。
本教程的源代码可在 GitHub 上获取。
以上是使用 Angular 和 MongoDB 建立部落格應用程式主頁的詳細內容。更多資訊請關注PHP中文網其他相關文章!