2013-09-30 68 views
12

以下代碼表示Sails.js v0.9.4中的賬戶模型。Sails.js中的唯一屬性失敗

module.exports = { 

     attributes: { 
     email: { 
      type: 'email', 
      unique: true, 
      required: true 
     }, 
     password:{ 
      type: 'string', 
      minLength: 6, 
      maxLength: 15, 
      required:true 
     } 
     } 

    }; 

當我把兩個職位,並通過Postman PUT請求爲localhost:8080 /賬戶,電子郵件的獨特屬性失敗。 具體來說,我從郵遞員發送以下HTTP請求:

POST http://localhost:8080/[email protected]&password=123456 
POST http://localhost:8080/[email protected]&password=123456  
PUT http://localhost:8080/account?id=1&[email protected] 
GET http://localhost:8080/account 

最後一個GET請求顯示我:

[ 
    { 
    "email": "[email protected]", 
    "password": "123456", 
    "createdAt": "2013-09-30T18:33:00.415Z", 
    "updatedAt": "2013-09-30T18:34:35.349Z", 
    "id": 1 
    }, 
    { 
    "email": "[email protected]", 
    "password": "123456", 
    "createdAt": "2013-09-30T18:33:44.402Z", 
    "updatedAt": "2013-09-30T18:33:44.402Z", 
    "id": 2 
    } 
] 

如果發生這種情況?
*對於不知道的人,Waterline默認生成一個在每次插入時自動遞增的id。

+0

我可以通過設置'autoPK克服這一 「錯誤」 的行爲。 – george

+0

當我把我的autoPK設置爲false時,我的id列被刪除。 –

回答

10

這是因爲你的模式是不是在您的磁盤更新數據庫(「.tmp/disk.db」)。

您需要關閉sails,放下數據庫並重新啓動sails。 數據庫將重建您的良好模式。

注意:數據也會下降!

如果你想保留你的數據,你可以更新「.tmp/disk.db」的模式部分。

我已經在做的sails.js保持數據以及重建模式:

  1. 複製 「的.tmp/disk.db」
  2. 乾淨 「的.tmp/disk.db」
  3. 關閉sails.js
  4. 開始sails.js - >數據庫是空的,
  5. 複製舊的「櫃檯」的架構更新部分
  6. 複製舊的「數據」部分

您必須在您的模式(文件「。TMP/disk.db」 - > 「模式」 部分)爲獨特的領域:

"xxx": { 
    "type": "string", 
    "unique": true 
    }, 

我希望這可以幫助您

+0

更好的解決方案是告訴Waterline更新數據庫模式 請參閱migrate設置並確保它設置爲' alter'('models.migrate ='alter'') – qualbeen

6

我遇到了同樣的問題。爲了解決這個問題,你必須避免使用'磁盤'ORM適配器。出於某種原因,它似乎不支持唯一性檢查。

其他適配器如mongo和mysql應該支持唯一性檢查,所以這不應該成爲開發之外的問題。

在開發過程中,將config/adapters.js中的默認適配器從「磁盤」更改爲「內存」。應該是這樣的:

module.exports.adapters = { 

    // If you leave the adapter config unspecified 
    // in a model definition, 'default' will be used. 
    'default': 'memory', 

    // In-memory adapter for DEVELOPMENT ONLY 
    memory: { 
    module: 'sails-memory' 
    }, 

    ... 
}; 
+0

我忘了提及我在發佈我的問題到stackoverflow之前嘗試'磁盤'和'內存'適配器。儘管沒有嘗試過數據庫。 – george

+0

您是否嘗試過與autoPK結合使用:true? – sethetter

+0

是的,我做到了。如果您注意到我的POST請求不需要id(即表示已啓用,即'autoPK:true')。 – george

1

我不能肯定這是問題,但你添加schema:true到您的模型和適配器?

我蒙戈適配器的配置是這樣的:

module.exports.adapters = { 
      'default': 'mongo', 
      mongo: { 
        module: 'sails-mongo', 
        url: process.env.DB_URL, 
        schema: true 
      } 
    }; 

我的用戶模型看起來像這樣(修剪了一下):

module.exports = { 
      schema: true, 
      attributes: { 
        username: { 
          type: 'string', 
          required: true, 
          unique: true 
        } 
        //... 
      } 
    }; 
+0

當'default'屬性是'disk'或'memory'時,我不認爲'schema'屬性很重要。我的結論是基於[Sails model documentation](http://sailsjs.org/#!documentation/models)。出於好奇,我用'schema:true' a給了'default:memory'和'default:disk'。 它沒有工作。 :( 與此同時,我將切換到MongoDB並繼續我的工作 – george

0
var InvoiceSchema = new Schema({ 
email: {type: 'email', required: true} 
    name : {type: String} 
}); 
InvoiceScheme({email: 1}, {unique: true}); 

集Uniquee在

的NodeJS
0

有沒有必要刪除當前數據庫來解決這個問題,而不是將水線migrate選項從safe改爲alter。這樣底層數據庫將適應這個設置。

雖然我不會在生產環境中推薦migrate: alter。 ;)


這是我/config/local.js

module.exports = { 

    ... 

    models: { 
     migrate: 'alter' 
    }, 
} 
0

根據

您應該配置在「改變」與創建模式「遷移」選項帆的官方文檔的索引

添加或刪除驗證從您的沒有任何問題模型隨着您的應用程序的發展而變化。但是一旦你投入生產,就有一個非常重要的例外:唯一的。在開發過程中,當您的應用程序配置爲使用migrate:'alter'時,您可以隨意添加或刪除獨特的驗證。但是,如果您正在使用migrate:safe (例如,使用您的生產數據庫),則需要更新數據庫中的 約束/索引,並且將數據移植爲 。 FALSE`:

http://sailsjs.com/documentation/concepts/models-and-orm/validations