Sequelize не поддерживает некоторые типы данных JavaScript. Мы представляем один из способов использования «естественных» типов JavaScript с помощью Sequelize.

Sequelize изначально не поддерживает типы данных JavaScript Boolean, Date, Object и Array. Это затрудняет написание независимого от базы данных кода, совместимого с базами данных NoSQL. Также неудобно писать «естественный» JavaScript.

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

Хук sequelizeConvert

Перехватчики Feathers - это промежуточное программное обеспечение, которое запускается до или после вызова службы базы данных, и они являются очевидным местом для выполнения перевода.

Хук sequelizeConvert, недавно добавленный в библиотеку общих хуков Feathers, автоматизирует преобразование. Вы можете назвать это с

const { sequelizeConvert } = require('feathers-hooks-common');
const convert = {
  isVerified: 'boolean',
  verifyExpires: 'date',
  verifyChanges: 'json',
  passwordHistory: 'json',
};
app.service('users').hooks({
  before: { all: [ sequelizeConvert(convert) ] },
  after:  { all: [ sequelizeConvert(convert) ] },
});
app.service('users').create({
  isVerified: false, verifyExpires: Date.now() + 60 * 60 * 24 * 2,
  verifyChanges: { email: '[email protected]' }, passwordHistory: [],
});

Крючок преобразует:

  • JavaScript Boolean true, false для Sequelize DataTypes.INTEGER 1 и 0.
  • Типы дат, например Date.now () в DataTypes.DATE. Даты со значением null сохраняются как nullby Sequelize и возвращаются в JavaScript как null.
  • Типы объектов и массивов в DataTypes.STRING с использованием JSON.stringify и JSON.parse.

Подпись ловушки sequelizeConvert(convert, ignores, conversions), где:

  • convert - это объект, как показано выше. Имена реквизитов - это имена полей в записи. Допустимые значения: boolean, date и json.
  • ignores - это необязательный массив имен полей, который не нужно преобразовывать. В некоторых случаях удобно иметь отдельный ignore, который отменяет convert.
  • conversion - необязательный объект, содержащий функции преобразования. Его можно использовать для отмены значения по умолчанию, используемого для каждого типа JavaScript. Функции по умолчанию:
const defaultConversions = {
  boolean: {
    sql: boolean => boolean ? 1 : 0,
    js: numb => !!numb,
  },
  date: {
    sql: dateNow => dateNow,
    js: sqlDate => new Date(sqlDate).valueOf() || null,
  },
  json: {
    sql: obj => JSON.stringify(obj),
    js: str => JSON.parse(str),
  }
};

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

В заключение

Эта статья является частью серии статей об использовании Sequelize in Feathers. Подпишитесь на публикацию The Feathers Flightpath, чтобы быть в курсе будущих статей.

Как всегда, не стесняйтесь присоединяться к Feathers Slack, чтобы присоединиться к обсуждению или просто подкрасться.