1. Code
  2. JavaScript
  3. React

Creating a Blogging App Using React, Part 2: User Sign-Up

Scroll to top
4 min read
This post is part of a series called Creating a Blogging App Using React.
Creating a Blogging App Using React, Part 1: User Sign-In
Creating a Blogging App Using React, Part 3: Add & Display Posts

In this series, we're aiming to create a blog using functional React components.

In the first part of this tutorial, we saw how to implement the sign-in functionality. Now, let's move to the sign-up functionality. 

Getting Started

Let's get started by cloning the GitHub repo from the first part of the tutorial.

1
git clone https://github.com/tutsplus/create-a-blogging-app-using-react

Once the directory has been cloned, navigate to the project directory and install the required dependencies.

1
cd my-blog
2
npm install

You should be able to see the application at https://localhost:3000. And the express server should be running at http://localhost:5000.

The Server

Previously, we saw how to GET sign-in data from our PSQL database. However, you have the freedom to choose any database for building the employee table. MongoDB is another popular choice.

To sign up, we need to post data to the database. To achieve this, we have to introduce the following piece of code in app.js. The following snippet will insert a new user into the users table. If something goes wrong during the insertion, an error will be thrown.

1
app.post('/api/posts/userprofiletodb', (req, res, next) => {
2
    const values = [req.email, 
3
                    req.pwd]
4
    pool.query(`INSERT INTO users(username, email, pwd, date_created)

5
                VALUES($1, $1, $2, NOW())

6
                ON CONFLICT DO NOTHING`, values,
7
            (q_err, q_res) => {
8
              if(q_err) return next(q_err);
9
              res.json(q_res.rows)
10
    })
11
})

The Client

As we are using a functional React component, useState and useReact will help us manage the state of the component.

Capturing Values

For each field in the sign-up form, we will have a state variable to listen to its changes. By default, these values are empty. 

1
  const [email, setEmail] = useState('')
2
  const [password, setPassword] = useState('')

The email and password defined using useState must be linked to the form elements. This can be achieved easily using the value property.

1
 <input type="text" id="inputName" value={email} className="form-control" placeholder="Name" required autoFocus />
2
       

It's important to change the value of the email and password state on user input. This can be achieved using the onChange property. When a user enters a value in the email field, the handleEmailChange function will be called and will set the value of the email state using the setEmail method. 

This is the most interesting part of useState in React functional components. State is initialized as a pair: a variable, and a function which can be called to set the value of the variable. In our case, email is the variable, and setEmail is the function to assign a value to email.

1
const handleEmailChange = (event) => {
2
    setEmail(event.target.value)
3
}
4
5
6
<input type="text" id="inputEmail" value={email} onChange={handleEmailChange} className="form-control" placeholder="Email" required autoFocus />
7
       

The above logic can be applied to the password field. 

1
const handlePasswordChange = (event) => {
2
    setPassword(event.target.value)
3
}
4
  
5
<input type="password" id="inputPassword" value={password} onChange={handlePasswordChange} className="form-control" placeholder="Password" required />
6
        

Validating Changes

One of the biggest perks of using native elements is validation. When the type of the input field is email, the native element validates if the data entered is valid or not. For example, if the email entered is invalid, a native popup will appear when the user clicks on the submit button. 

invalid email popupinvalid email popupinvalid email popup

Likewise, we can fix the minimum number of characters to be entered in a field using the minlength property of the input element. This check would throw an error if the user has entered fewer characters. One of the places where we can use this check is on the password. 

1
<input type="password" minlength="8" id="inputPassword" value={password} onChange={handlePasswordChange} className="form-control" placeholder="Password" required />
2
        
minimum length popupminimum length popupminimum length popup

Sign Up

If the user has entered the right data, the signup post call can be made.

Define a signup method called handleSubmit. Inside the handleSubmit method, make a post method call to the signup API endpoint. Here, I'm using the Axios library for fetching.

1
const handleSubmit = () => {
2
      var data = new FormData();
3
      data.append('email', email);
4
      data.append('pwd', password);
5
      
6
      var config = {
7
        method: 'get',
8
        url: `http://localhost:5000/api/get/userprofilefromdb?email=${email}`,
9
        headers: { 
10
          ...data.getHeaders()
11
        },
12
        data : data
13
      };
14
    
15
    axios(config)
16
      .then(function (response) {
17
        // get access to the return data from the POST API endpoint

18
        const data = response.data
19
        navigate("/landing")
20
      })
21
      .catch(function (error) {
22
        setError(error.message)
23
      });
24
    }

Developers often wonder if they should choose Axios or fetch for their single-page application. Axios is a common pick, and here are a few reasons:

  • Axios is much more secure than the Fetch API. Axios comes with cross-site forgery protection.
  • fetch is not supported in older IE browsers. This means that a polyfill has to be written if your application is likely to be opened in older browsers.
  • Requests made using fetch cannot be aborted. 
  • fetch does not allow request timeouts. The timeout logic has to be implemented by the client-side application.

The Sign-Up Page in Action

With all these elements put together, you will see the Sign Up page as below.

sign up pagesign up pagesign up page

If the API endpoint returns a response, the user can be redirected to the /landing blog page. And if the API endpoint throws an error, the error will be displayed on the screen.

error messageerror messageerror message

A Working Demo

Here is a working demo in StackBlitz for your reference.

Wrapping It Up

In this part of the tutorial, you saw how to implement the user sign-up process. We saw different types of validation, different ways of calling an endpoint, and a simple server-side change.

In the next part of the tutorial, you'll implement the "add post" and "display post" page functionality.

Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.