SailsJS - Как указать длину строкового атрибута без ошибок при создании записи?

Я использую Sails 0.9.8 в паре с MySQL и хочу сделать что-то вроде этого

localhost:1337/player/view/<username of player>

вместо

localhost:1337/player/view/<id of player>

Итак, я поместил что-то подобное в модель:

'username' : {
        type: 'string',
        unique: true,
        minLength: 4,
        maxLength: 32,
        required: true
    },

Но у меня появляется ошибка всякий раз, когда я запускаю паруса:

{ [Error: ER_TOO_LONG_KEY: Specified key was too long; max key length is 767 bytes] code: 'ER_TOO_LONG_KEY', index: 0 }

Поэтому после того, как я пробежал по модулям, я обнаружил, что это происходит потому, что по умолчанию Sails задают атрибут типа строки длиной 255 в базе данных. Заданная длина может быть переопределена с помощью 'size', но это вызывает другую ошибку при создании записи.

'username' : {
        type: 'string',
        unique: true,
        minLength: 4,
        maxLength: 32,
        size: 32,
        required: true
    },

Ошибка, возникшая при создании записи:

Error: Unknown rule: size
at Object.match (<deleted>npm\node_modules\sails\node_modules\waterline\node_modules\anchor\lib\match.js:50:9)
at Anchor.to (<deleted>\npm\node_modules\sails\node_modules\waterline\node_modules\anchor\index.js:76:45)
at <deleted>\npm\node_modules\sails\node_modules\waterline\lib\waterline\core\validations.js:137:33

Вопрос в том, как указать размер строкового столбца (чтобы я мог использовать уникальный ключ), не получая ошибки при создании записи?

2 ответа

Решение

Вы можете обойти это, определив пользовательские правила проверки с помощью объекта типов. В частности, данная проблема может быть решена путем определения size валидатор, который всегда возвращает истину.

// api/models/player.js
module.exports = {
  types: {
    size: function() {
       return true;
    }
  },

  attributes: {
    username: {
      type: 'string',
      unique: true,
      minLength: 4,
      maxLength: 32,
      size: 32,
      required: true
    }
  }
}

Отмеченный ответ тихий старый. Согласно последней версии паруса (1.0.2 на момент написания этого ответа),

Я использовал columnType атрибут, как это:

attributes: {

  longDescription: {
    type: 'string',
    columnType: 'text'
  }
}
Другие вопросы по тегам