SailsJS - 如何在创建记录时指定字符串属性长度而不会出错?

时间:2014-01-26 03:52:11

标签: mysql node.js sails.js waterline

我正在使用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在数据库中为string-type属性提供了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 个答案:

答案 0 :(得分:9)

您可以通过types对象定义custom validation rules来解决此问题。具体而言,可以通过定义始终返回true的自定义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 :(得分:1)

标记的答案很安静。根据最新的风帆版本(截至编写本答复之日的1.0.2),

我使用了columnType这样的属性:

attributes: {

  longDescription: {
    type: 'string',
    columnType: 'text'
  }
}