1. Code
  2. JavaScript
  3. React

Создание приложения для блога на React, часть 1: вход пользователя в систему

Scroll to top
This post is part of a series called Creating a Blogging App Using React.
Creating a Blogging App Using React, Part 2: User Sign-Up

Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

В этой серии учебников вы увидите, как начать работу с созданием приложения для ведения блога с помощью React. На протяжении всей этой серии учебников вы будете сосредоточены на том, как использовать React для разработки пользовательского интерфейса для вашего приложения. Для серверной части приложения мы будем использовать Node.js

В этом уроке вы увидите, как реализовать пользовательский интерфейс и бекенд для регистрации пользователя и входа пользователя.

Начинаем

Создайте каталог проекта и назовите его ReactNodeApp.  Перейдите в каталог проекта и инициируйте проект node.

1
npm init

Заполните необходимые данные, и вы должны будите получить файл package.json. Вот как он выглядит:

1
{
2
  "name": "react-node-app",
3
  "version": "1.0.0",
4
  "description": "",
5
  "main": "index.js",
6
  "scripts": {
7
    "test": "echo \"Error: no test specified\" && exit 1"
8
  },
9
  "author": "roy",
10
  "license": "MIT"
11
}

Вы будете использовать фреймворк express для обслуживания вашего приложения. Установите express, используя следующую команду:

1
npm install express --save

Используя Фреймворк express, давайте создадим наше приложение, прослушивающее адрес порта. Внутри каталога проекта создайте файл под названием app.js. Подключим модуль express внутри app.js и создадим приложение. Задайте статический путь приложения, где оно сможет найти статические файлы. Вот как это выглядит:

1
var express = require("express");
2
var path = require("path");
3
4
var app = express();
5
app.use(express.static(path.join(__dirname,"/html")));

Назначьте номер порта, который приложение будет прослушивать. Добавьте следующий код для создания сервера:

1
app.listen(7777,function(){
2
    console.log("Started listening on port", 7777);
3
})

Внутри каталога проекта создайте папку html. Внутри html-папки создайте файл index.html. Добавьте следующий код в index.html:

1
<html>
2
3
<head></head>
4
5
<body>
6
    <div>
7
        Hello World
8
    </div>
9
</body>
10
11
</html>

Сохраните указанные выше изменения и запустите сервер, используя следующую команду:

1
node app.js

Откройте в своем браузере следующий адрес http://localhost:7777/index.html, и вы сможете увидеть страницу index.html.

Создание окна входа в систему

Вы будете использовать bootstrap для создания пользовательского интерфейса. Загрузите и подключите bootstrap на странице index.html.

1
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

Добавьте необходимые библиотеки React на страницу index.html.

1
<script src="https://fb.me/react-15.1.0.js"></script>
2
<script src="https://fb.me/react-dom-15.1.0.js"></script>

Вы создадите представление с помощью JSX. Если вы не знакомы с JSX, я бы рекомендовал прочитать вводный учебник по React и JSX.

Чтобы преобразовать JSX-код в JavaScript, вам понадобится babel, компилятор JavaScript. Подключите babel на странице index.html.

1
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

Создайте файл main.jsx внутри папки html. Этот файл будет содержать компоненты React UI.

Давайте создадим новый компонент React под названием Signin внутри файла main.jsx.

1
class Signin extends React.Component {
2
3
}

Добавьте метод render внутри компонента Signin, который отобразит пользовательский интерфейс для нашего компонента Signin.

1
class Signin extends React.Component {
2
    render() {
3
        return (
4
      	<form className="form-signin">
5
                <h2 className="form-signin-heading"> Please sign in </h2>

6
                <label for="inputEmail" className="sr-only"> Email address
7
                </label>

8
                <input type="email" id="inputEmail" className="form-control" placeholder="Email address" required autofocus />
9
                <label for="inputPassword" className="sr-only"> Password</label>

10
                <input type="password" id="inputPassword" className="form-control" placeholder="Password" required />
11
                <button className="btn btn-lg btn-primary btn-block" type="button"> Sign in
12
                </button>

13
            </form>

14
        )
15
    }
16
}

В приведенном выше коде это всего лишь HTML с одним отличием. Атрибут class был изменен на className при использовании в JSX.

Компонент Signin, когда отображается, отображает HTML-код внутри метода render.

Добавьте контейнер div на страницу index.html, где вы будете отображать компонент Signin.

1
<div id="app" class="container">
2
</div>

Выведите компонент Signin внутри .container div в index.html.

1
ReactDOM.render( <
2
    Signin / > ,
3
    document.getElementById('app')
4
);

Сохраните указанные выше изменения и перезапустите сервер. В своем браузере откройте http://localhost:7777/index.html, и вы должны будите увидеть экран входа.

React Blog App SignIn ScreenReact Blog App SignIn ScreenReact Blog App SignIn Screen

Реализация входа пользователя

Чтобы реализовать процесс входа в систему, вам необходимо обработать введенный текст и событие onChange а затем сохранить значения текстового поля в переменной состояния. Когда пользователь нажимает кнопку, вы будете использовать переменные состояния для чтения значений текстового поля адреса электронной почты и пароля. Итак, добавим событие onChange в текстовые поля:

1
<label for="inputEmail" className="sr-only">Email address</label>
2
<input type="email" onChange={this.handleEmailChange} id="inputEmail" className="form-control" placeholder="Email address" required autofocus />
3
<label for="inputPassword" className="sr-only">Password</label>
4
<input type="password" onChange={this.handlePasswordChange} id="inputPassword" className="form-control" placeholder="Password" required />

Определите события onChange в компоненте Signin:

1
handleEmailChange(e){
2
    this.setState({email:e.target.value})
3
}
4
handlePasswordChange(e){
5
    this.setState({password:e.target.value})
6
}

Привяжите указанные выше события и переменные состояния в методе конструктора компонента:

1
constructor(props) {
2
    super(props);
3
    this.handleEmailChange = this.handleEmailChange.bind(this);
4
    this.handlePasswordChange = this.handlePasswordChange.bind(this);
5
    this.state = {
6
      email:'',
7
      password:''
8
    };
9
}

Определите метод onClick, который вы будете вызывать при нажатии кнопки.

1
signIn(){
2
    alert('Email address is ' + this.state.email + ' Password is ' + this.state.password);            
3
}

Добавьте событие OnClick в кнопку SignIn.

1
<button className="btn btn-lg btn-primary btn-block" onClick={this.signIn} type="button">Sign in</button>

Сохраните указанные выше изменения и перезапустите сервер. В своем браузере откройте http://localhost:7777/index.html. Введите адрес электронной почты и пароль и нажмите кнопку «Sign In», и вы сможете увидеть, как всплывают письма и пароль.

Передача данных из React в Node

После того, как у вас есть данные на стороне клиента, вам необходимо отправить эти данные на серверный метод Node.js, чтобы проверить вход пользователя в систему. Для отправки данных вы будете использовать другой скрипт под названием axios. Axios - это HTTP-клиент на основе промисов для браузера и Node.js. Подключите axios на странице index.html.

1
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

Внутри метода signin в файле main.jsx добавьте следующую строку кода, чтобы сделать пост запрос.

1
axios.post('/signin', {
2
  email: this.state.email,
3
  password: this.state.password
4
})
5
.then(function (response) {
6
  console.log(response);
7
})
8
.catch(function (error) {
9
  console.log(error);
10
});

Код делает пост запрос методу /signin с указанными параметрами. Как только запрос будет успешным, промис будет разрешено в обратном вызове then. При ошибке ответ регистрируется в обратном вызове catch.

Давайте создадим метод signin на стороне Node.js для проверки процесса входа пользователя. В файле app.js создайте метод под названием signin.

1
app.post('/signin', function (req, res) {
2
 
3
})

Вы будете использовать модуль body-parser для анализа запроса, отправленного с клиентской стороны React. Установите модуль body-parser в проект.

1
npm install body-parser --save

Подключите модуль body-parser в файле app.js.

1
var bodyParser = require("body-parser");

Добавьте следующую строку кода, чтобы разрешить разбор JSON.

1
app.use(bodyParser.json());

Внутри метода signin вы можете разобрать запрос, как показано здесь:

1
var user_name=req.body.email;
2
var password=req.body.password;

Измените метод signin, как показано для подтверждения входа пользователя.

1
app.post('/signin', function (req, res) {
2
  var user_name=req.body.email;
3
  var password=req.body.password;
4
  if(user_name=='admin' && password=='admin'){
5
      res.send('success');
6
  }
7
  else{
8
  	res.send('Failure');
9
  }
10
})

В настоящее время учетные данные пользователя жестко закодированы. Вы можете заменить его соответствующим сервисом в соответствии с вашими предпочтениями.

Как только параметры были проанализированы, они проверяются на ожидаемые учетные данные. Если true, передается сообщение об успешном завершении, иначе возвращается сообщение об ошибке.

Сохраните указанные выше изменения и перезапустите сервер Node.js. Введите действительное имя пользователя и пароль и нажмите метод входа. На основе учетных данных он вернет сообщение об успешном завершении или сбое, которое будет отображаться в консоли браузера.

Создание представления регистрации пользователя

Процесс создания пользовательского регистрационного представления очень похож на то, как вы внедрили модуль входа пользователя. Начнем с создания компонента Signup в файле main.jsx.

1
class Signup extends React.Component{
2
  render() {
3
      return (
4
        <div>
5
          <form className="form-signin">
6
            <h2 className="form-signin-heading">Please sign up</h2>

7
            <label for="inputName" className="sr-only">Name</label>

8
            <input type="name" onChange={this.handleNameChange} id="inputName" className="form-control" placeholder="Name" required autofocus />
9
            <label for="inputEmail" className="sr-only">Email address</label>

10
            <input type="email" onChange={this.handleEmailChange} id="inputEmail" className="form-control" placeholder="Email address" required autofocus />
11
            <label for="inputPassword" className="sr-only">Password</label>

12
            <input type="password" onChange={this.handlePasswordChange} id="inputPassword" className="form-control" placeholder="Password" required />
13
            
14
            <button className="btn btn-lg btn-primary btn-block" onClick={this.signUp} type="button">Sign up</button>

15
          </form>

16
        </div>

17
        
18
      )
19
    }
20
}

Поскольку регистрация и вход в систему - это два разных компонента, вам необходимо связать эти два компонента. В целях маршрутизации вы будете использовать react-router. Если вы новичок в маршрутизации в React, я бы рекомендовал прочитать учебник по маршрутизации React.

Подключите react-router на странице index.html.

1
<script src="https://npmcdn.com/react-router@3.0.2/umd/ReactRouter.min.js"></script>

Определите требуемые переменные react-router для создания ссылок в файле main.jsx.

1
var Router = window.ReactRouter.Router;
2
var Route = window.ReactRouter.Route;
3
var hashHistory = window.ReactRouter.hashHistory;
4
var Link = window.ReactRouter.Link;

Определите различные маршруты и маршрут по умолчанию, как показано ниже:

1
ReactDOM.render(
2
    <Router history={hashHistory}>
3
        <Route component={Signin} path="/"></Route>

4
        <Route component={Signup} path="/signup"></Route>

5
    </Router>,

6
document.getElementById('app'));

Включите ссылку на компонент входа в компонент регистрации и наоборот. Вот метод render компонента Signin со ссылкой для регистрации:

1
render() {
2
  return (
3
    <div>
4
      <form className="form-signin">
5
        <h2 className="form-signin-heading">Please sign in</h2>

6
        <label for="inputEmail" className="sr-only">Email address</label>

7
        <input type="email" onChange={this.handleEmailChange} id="inputEmail" className="form-control" placeholder="Email address" required autofocus />
8
        <label for="inputPassword" className="sr-only">Password</label>

9
        <input type="password" onChange={this.handlePasswordChange} id="inputPassword" className="form-control" placeholder="Password" required />
10
        
11
        <button className="btn btn-lg btn-primary btn-block" onClick={this.signIn} type="button">Sign in</button>

12
      </form>

13
      <div>
14
        <Link to="/signup">{'Signup'}</Link>

15
      </div>

16
    </div>

17
18
  )
19
}

Сохраните указанные выше изменения и перезапустите сервер Node.js.  В своем браузере откройте http://localhost:7777/index.html, и вы сможете увидеть экран входа с ссылкой на регистрацию. Нажмите на ссылку регистрации, и вы должны перейти на экран регистрации.

Sign In Screen with Sign Up LinkSign In Screen with Sign Up LinkSign In Screen with Sign Up Link

Внедрение регистрации пользователя аналогично тому, как вы выполнили вход пользователя. Я оставлю реализацию регистрации пользователя в качестве упражнения. В следующей части этой серии уроков я опубликую версию регистрации пользователя.

Подведем итоги

В этой части серии учебников вы создали и внедрили экран входа в систему. Вы также видели, как использовать react-router для реализации маршрутизации в React. В следующей части этого урока вы увидите, как реализовать раздел «Sign Up» и «Add Post».

Исходный код этого учебника доступен в GitHub.

Сообщите нам свои мысли и предложения в комментариях ниже.