TypeError: s.replace is not a function

nikhil84 picture nikhil84 · Feb 19, 2018 · Viewed 9.8k times · Source

Env:

  • Postgres: 10.2
  • Node: 6.11.0
  • CLI: 2.4.0
  • ORM: 2.1.3

Model:

'use strict';
module.exports = function(sequelize, DataTypes) {
    var test = sequelize.define('test', {
        id: DataTypes.UUID,
        type: DataTypes.STRING,
        data: DataTypes.JSON,
    }, {
        'createdAt': {
            type: Sequelize.DATE(3),
            defaultValue: Sequelize.literal('CURRENT_TIMESTAMP(3)'),
        },
        'updatedAt': {
            type: Sequelize.DATE(3),
            defaultValue: Sequelize.literal('CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)'),
        },
        classMethods: {
            associate: function(models) {
                // associations can be defined here
            }
        }
    });
    return test;
}

Migration:

'use strict';
module.exports = {
    up: function(queryInterface, Sequelize) {
        return queryInterface.addColumn('test', {
            test_col: {
                type: Sequelize.JSONB
            }
        });
    },
    down: function(queryInterface, Sequelize) {
        return queryInterface.removeColumn('test', 'test_col');
    }
};

Error:

TypeError: s.replace is not a function
    at Object.removeTicks (/node_modules/sequelize/lib/utils.js:329:14)
    at Object.addTicks (/node_modules/sequelize/lib/utils.js:325:29)
    at Object.quoteIdentifier (/node_modules/sequelize/lib/dialects/postgres/query-generator.js:835:22)
    at Object.addColumnQuery (/node_modules/sequelize/lib/dialects/postgres/query-generator.js:182:19)
    at QueryInterface.module.exports.QueryInterface.addColumn 

Answer

Vedang Sharma picture Vedang Sharma · Feb 19, 2018

The syntax used for migration is incorrect. The queryInterface.addcolumn method expects 3 arguments while you are passing only 2. See here.

public addColumn(table: String, key: String, attribute: Object, options: Object): Promise

'use strict';
module.exports = {
  up: function(queryInterface, Sequelize) {
    return queryInterface.addColumn(
          'pages',
          'group',
          Sequelize.JSONB
      );
  },
  down: function(queryInterface, Sequelize) {
    return queryInterface.removeColumn('pages', 'group');
  }
};

And to anybody getting s.replace error it is basically because you are not passing the expected type of argument. So in above case, an object was passed as second parameter to queryInterface.addColumn while it was expecting a String literal. Read more here.