Sequelize.js: How to Validate an Email Address

Updated: December 29, 2023 By: Guest Contributor Post a comment

Overview

Email validation is a critical aspect of modern web applications. When storing user data, it’s important to ensure that email addresses are valid to maintain data integrity and improve user experience. Sequelize.js, a popular Node.js ORM for relational databases, provides robust built-in mechanisms to validate email addresses before they are persisted to the database. This tutorial will guide you through the steps of using Sequelize to validate email addresses in a Node.js application.

Setting Up Sequelize

Before diving into email validation, let’s set up a basic Sequelize environment:

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');

const User = sequelize.define('User', {
  email: {
    type: DataTypes.STRING,
    allowNull: false
  }
});

(async () => {
  await sequelize.sync({ force: true });
  // Database synced
})();

Basic Email Validation

The simplest way to validate an email address is to use the built-in `isEmail` validator provided by Sequelize:

const User = sequelize.define('User', {
  email: {
    type: DataTypes.STRING,
    allowNull: false,
    validate: {
      isEmail: true
    }
  }
});

This code will ensure that any email address saved must be a valid email format. If a non-valid email address is attempted to be saved, Sequelize will throw a ValidationError.

Custom Email Validation

If you need more control over the email validation process, Sequelize allows you to define custom validators:

const User = sequelize.define('User', {
  email: {
    type: DataTypes.STRING,
    allowNull: false,
    validate: {
      isEmail: true,
      customValidator(value) {
        if (!value.endsWith('@example.com')) {
          throw new Error('Email must be from example.com domain');
        }
      }
    }
  }
});

This custom validator will check that the email address not only is formatted correctly but also ends with ‘@example.com’.

Asynchronous Validation

Sometimes, you might need to perform an asynchronous operation to validate your email, such as checking for the email’s existence in the database:

const User = sequelize.define('User', {
  email: {
    type: DataTypes.STRING,
    allowNull: false,
    validate: {
      isEmail: true,
      async isUnique(value) {
        const exists = await User.findOne({ where: { email: value } });
        if (exists) {
          throw new Error('Email already in use.');
        }
      }
    }
  }
});

With the `isUnique` async validator, Sequelize will wait for the database check to complete before proceeding, thus ensuring uniqueness of the email address.

Handling Validation Errors

When validation fails, Sequelize throws a `ValidationError` which you can catch and handle accordingly:

async function createUser(email) {
  try {
    await User.create({ email });
  } catch (error) {
    if (error instanceof Sequelize.ValidationError) {
      // Handle validation errors
    }
  }
}

This function attempts to create a user and handles any validation errors that may occur, allowing you to provide informative feedback to your users.

Advanced Validation Scenarios

In more advanced scenarios, you may want combinations of validators or even integrate third-party libraries for email validation. Sequelize’s flexible validate object allows you to manage complex validation logic.

Conclusion

In conclusion, validating email addresses using Sequelize.js is straightforward and flexible, offering you a mix of simple built-in validations and the power to craft custom validation.functions. By ensuring the data integrity of your user’s emails, you’re setting the groundwork for a reliable and trustworthy web application.