angular 和 mongodb 创建博客应用程序:登录 使用 Angular 和 MongoDB 创建博客应用程序:显示帖子. 在本教程系列的第一部分,您了解了如何开始创建 Angular Web 应用程序。您学习了如何设置应用程序并创建了登录组件。
在本系列的这一部分中,您将进一步写下与mongodb *** 端交互所需的其余 api 。您还将创建将在用户成功登录后显示的组件。
入门
让我们从克隆教程系列第一部分的源代码开始。
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 ,您应该会显示该消息。
您将使用和参数post
从 Angular 服务向服务器发出请求。所以需要解析请求参数。username
password
Install 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
body,只查看 Content-Type
header匹配es type
选项的请求。
您将用于与Node.jsmongoose
进行交互。MongoDB
所以Mongoose
使用 Node Package Manager (npm) 安装。
npm install mongoose --save
安装 mongoose 后,将其导入app.js
.
const mongoose = require('mongoose');
在 中定义 MongoDB 数据库 URL app.js
。
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); }); })
如果建立了连接,则该消息将与username
和一起记录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 服务器,您需要设置代理。proxy.json
在文件夹内创建一个名为的client/src
文件。这是它的外观:
{ "/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
.
user.js
在文件夹内创建一个名为的model
文件。将以下代码添加到 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
. 您userSchema
使用猫鼬创建了一个并使用 模型schema
创建了模型。User
mongoose
导入user.js
文件里面的app.js
文件。
const User = require('./model/user');
在查询 MongoDBuser
集合之前,您需要创建集合。通过键入 转到 MongoDB shell mongo
。user
使用以下命令创建集合:
db.createCollection('user')
插入您将要查询的记录。
db.user.insert({ name: 'roy agasthyan', username: 'roy', password: '123' })
现在,一旦 mongoose 连接到 MongoDB,您将使用传入的username
和从数据库中找到记录password
。以下是 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' }) } }) }); })
如上面的代码所示,一旦您收到来自数据库的响应,您就会将其返回给客户端。
保存上述更改并尝试运行客户端和服务器。输入用户名 asroy
和密码 as 123
,您应该能够在浏览器控制台中查看结果。
重定向到 Home 组件
成功验证用户后,您需要将用户重定向到Home
组件。因此,让我们从创建Home
组件开始。
Home
在文件夹内创建一个名为的src/app
文件夹。创建一个名为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>
创建一个名为并添加以下 css 样式的文件:home.component.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 { }
如上面的代码所示,您刚刚创建了HomeComponent
使用@Component
装饰器并指定selector
、templateUrl
和styleUrls
.
添加HomeComponent
到NgModules
in 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 { }
导入并HomeComponent
为app.routing.ts
定义路由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);
在文件中的validateLogin
方法中 login.component.ts
,成功验证后将用户重定向到HomeComponent
. 要重定向,您需要导入 Angular Router
。
import { Router } from '@angular/router';
如果 API 调用的响应成功,您将导航到HomeComponent
使用 Angular Router
。
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 进行交互。成功验证后,您看到了如何使用 AngularRouter
导航到HomeComponent
.
您学习编写 Angular 应用程序及其后端的经验如何?请在下面的评论中告诉我们您的想法和建议。
本教程的源代码可在GitHub 上获得。