Статьи

Создание блогового приложения с использованием Angular & MongoDB: Home

В первой части серии руководств вы узнали, как начать создавать веб-приложение на Angular. Вы узнали, как настроить приложение, и создали компонент Login.

В этой части серии вы пойдете дальше и запишите REST API, необходимый для взаимодействия с банком MongoDB. Вы также создадите компонент Home который будет отображаться после успешного входа пользователя.

Давайте начнем с клонирования исходного кода из первой части серии руководств.

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

Перейдите в каталог проекта и установите необходимые зависимости.

1
2
cd AngularBlogApp-Home/client
npm install

После установки зависимостей перезапустите сервер приложений.

1
npm start

Укажите в браузере http: // localhost: 4200, и приложение должно быть запущено.

В папке проекта AngularBlogApp-Home создайте еще одну папку с именем server . Вы будете писать API REST, используя Node.js.

Перейдите в папку на server и инициализируйте проект.

1
2
cd server
npm init

Введите необходимые данные, и вы должны инициализировать проект.

Вы будете использовать Express Framework для создания сервера. Установите Express используя следующую команду:

1
npm install express —save

После установки Express создайте файл с именем app.js Это будет корневой файл для вашего сервера Node.js.

Вот как app.js файл app.js :

1
2
3
4
5
6
7
8
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, используя следующую команду:

1
node app.js

Укажите в браузере http: // localhost: 3000 / api / user / login, и у вас должно появиться сообщение.

Вы будете делать POST запрос от службы Angular на сервер с параметрами username и password . Поэтому вам нужно проанализировать параметры запроса.

Установите body-parser , который является промежуточным программным обеспечением для синтаксического анализа тела Node.js, для анализа параметров запроса.

1
npm install body-parser —save

После того, как он установлен, импортируйте его в app.js

1
const bodyParser = require(‘body-parser’)

Добавьте следующий код в файл app.js

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

Вышеупомянутые два параметра body-parser возвращают промежуточное программное обеспечение, которое анализирует только тела json и urlencoded и просматривает только те запросы, в которых заголовок Content-Type соответствует параметру type .

Вы будете использовать Mongoose для взаимодействия с MongoDB из Node.js. Так что установите Mongoose с помощью Node Package Manager (npm).

1
npm install mongoose —save

После установки mongoose импортируйте его в app.js

1
const mongoose = require(‘mongoose’);

Определите URL базы данных MongoDB в app.js

1
const url = ‘mongodb://localhost/blogDb’;

Давайте использовать Mongoose для подключения к базе данных MongoDB. Вот как это выглядит:

1
2
3
4
5
6
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 файл app.js :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
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-сервер, используя следующую команду:

1
node app.js

Чтобы подключиться к Node-серверу из приложения Angular, вам необходимо установить прокси. Создайте файл с именем proxy.json в папке client/src . Вот как это выглядит:

1
2
3
4
5
6
{
    «/api/*»: {
        «target»: «http://localhost:3000»,
        «secure»: «false»
    }
}

Измените файл client package.json чтобы запустить приложение с использованием файла прокси.

1
«start»: «ng serve —proxy-config proxy.json»

Сохраните изменения и запустите клиентский сервер.

1
npm start

В браузере укажите http: // localhost: 4200 и введите имя пользователя и пароль. Нажмите кнопку входа, и вы должны зарегистрировать параметры в консоли Node.

Чтобы взаимодействовать с MongoDB с помощью Mongoose, вам нужно определить схему и создать модель. Внутри папки server создайте папку с именем model .

Создайте файл с именем user.js внутри папки model . Добавьте следующий код в файл user.js :

01
02
03
04
05
06
07
08
09
10
11
12
13
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 mongoose, и создали модель User используя модель mongoose .

Импортируйте файл user.js внутри файла app.js

1
const User = require(‘./model/user’);

Прежде чем обращаться к коллекции user MongoDB, вам необходимо создать коллекцию. Перейдите в оболочку MongoDB, набрав mongo . Создайте user коллекции с помощью следующей команды:

1
db.createCollection(‘user’)

Вставьте запись, к которой вы будете обращаться.

1
2
3
4
5
db.user.insert({
    name: ‘roy agasthyan’,
    username: ‘roy’,
    password: ‘123’
})

Теперь, когда mongoose подключится к MongoDB, вы найдете запись из базы данных, используя переданные username и password . Вот как выглядит API:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
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 .

Создайте папку с именем Home внутри папки src/app . Создайте файл с именем home.component.html и добавьте следующий HTML-код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<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)
            </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.
        <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.
 
            <h4>Subheading</h4>
            <p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
 
            <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.
 
            <h4>Subheading</h4>
            <p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
 
            <h4>Subheading</h4>
            <p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p>
        </div>
    </div>
 
</main>
 
<footer class=»footer»>
    <p>&copy;
</footer>

Создайте файл с именем home.component.css и добавьте следующий стиль CSS:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
.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 и добавьте следующий код:

01
02
03
04
05
06
07
08
09
10
import { Component } from ‘@angular/core’;
 
@Component({
  selector: ‘app-home’,
  templateUrl: ‘./home.component.html’,
  styleUrls: [‘./home.component.css’]
})
export class HomeComponent {
   
}

Как видно из приведенного выше кода, вы только что создали @Component декоратор @Component и указав selector , templateUrl и styleUrls .

Добавьте NgModules к NgModules в app.module.ts .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 .

01
02
03
04
05
06
07
08
09
10
11
12
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 .

1
import { Router } from ‘@angular/router’;

Если ответ на вызов API будет успешным, вы перейдете к HomeComponent с помощью углового Router .

1
2
3
4
5
if(result[‘status’] === ‘success’) {
  this.router.navigate([‘/home’]);
} else {
  alert(‘Wrong username password’);
}

Вот как login.component.ts файл login.component.ts :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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 Blog App Домашний компонент

В этом руководстве вы увидели, как написать конечную точку API REST для входа пользователя. Вы узнали, как использовать Mongoose для взаимодействия с MongoDB из Node. После успешной проверки вы увидели, как использовать Angular Router для перехода к HomeComponent .

Как ваш опыт научился писать приложение Angular и его бэкэнд? Дайте нам знать ваши мысли и предложения в комментариях ниже.

Исходный код из этого урока доступен на GitHub .