In sequelize even if we set timezone when we create a record ,it
createdAt & updatedAt dates are always in UTC timezone.
but when i save a record in database time is in indian timezone.I
I am initializing my connection with following code
const sequelize = new Sequelize(
    process.env.MYSQL_DATABASE,
    process.env.MYSQL_USER_NAME,
    process.env.MYSQL_PASSWORD, {
    dialect: 'mysql',
    host: process.env.MYSQL_HOST,
    port: process.env.MYSQL_PORT,
    dialectOptions: {
        dateStrings: true,
        typeCast: true
    },
    timezone: '+05:30', // for writing to database
}
);
so i am modifying my User Model class as follows
const sequelize = require('../utils/database')
const bcrypt = require("bcrypt");
var moment = require('moment')
module.exports = function (sequelize, DataTypes) {
    const User = sequelize.define('User', {
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true
        },
        firstName: {
            type: DataTypes.STRING,
            field: 'firstName'
        },
        lastName: {
            type: DataTypes.STRING,
            field: 'lastName'
        },
        email: DataTypes.STRING,
        password: DataTypes.STRING,
        createdAt: {
            type: DataTypes.DATE,
            get: function () { // or use get(){ }
                var originalDate = this.getDataValue('createdAt')
                return  moment(originalDate).utcOffset(330).
format('YYYY-MM-DD HH:mm:ss');                
            }
        },
        updatedAt: {
            type: DataTypes.DATE,
            get: function () { // or use get(){ }
                var originalDate = this.getDataValue('createdAt')
                return  moment(originalDate).utcOffset(330).
format('YYYY-MM-DD HH:mm:ss');                
            }
        }
    }, {
        freezeTableName: true,
        hooks: {
            beforeCreate: async (user, options) => {
                user.password = await bcrypt.hash(user.password, bcrypt.genSaltSync(8))
            }
        },
        classMethods: {
        },
        instanceMethods: {
            generateHash(password) {
                return bcrypt.hash(password, bcrypt.genSaltSync(8))
            }
        }
    });
    return User;
}
Here in createdAt & updatedAt I added proprty getter get function,
now you can get createdAt & updatedAt in indian timezone even in 
output of User models Create.
Code can be found at :https://github.com/gitsangramdesai/sequelize-validation
 
No comments:
Post a Comment