• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

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

angularmongodb 创建博客应用程序:登录 使用 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!'))

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

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

node app.js

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

您将使用参数post从 Angular 服务向服务器发出请求。所以需要解析请求参数。usernamepassword

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 和urlencodedbody,只查看 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.jsuserSchema使用猫鼬创建了一个并使用 模型schema创建了模型。Usermongoose

导入user.js文件里面的app.js文件。

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

在查询 MongoDBuser 集合之前,您需要创建集合。通过键入 转到 MongoDB shell mongouser使用以下命令创建集合:

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>&copy; 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装饰器并指定selectortemplateUrlstyleUrls

添加HomeComponentNgModulesin 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 { }

导入并HomeComponentapp.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.

使用Angular和MongoDB创建博客应用程序:主页  第1张

概括

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

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

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


文章目录
  • 入门
  • 创建登录 rest API
  • 验证用户登录
  • 重定向到 Home 组件
  • 概括