2013-09-25 69 views
7

我使用Sequelize作爲ORM。這裏是我的用戶模型:get .findOrCreate()錯誤

### 
    User model 
### 
User = exports.User = globals.sequelize.define "User", 
    username: globals.Sequelize.STRING 
    email: 
     type: globals.Sequelize.STRING 
     validate: 
      isEmail: true 
    hash:  globals.Sequelize.STRING 
    salt:  globals.Sequelize.STRING(512) 
    fname: globals.Sequelize.STRING 
    lname: globals.Sequelize.STRING 
    country: globals.Sequelize.STRING 

我節省用戶:

globals.models.User.findOrCreate 
    username: "johny" 
    password: "pass" 
    email: "johny93[###]example.com" 
.success (user, created)-> 
    console.log user.values 
    res.send 200 
.error -> 
    console.log err # how to catch this? 
    res.send 502 

如果電子郵件是有效的(電子郵件: 「[email protected]」),一切都很正常。但是,如果電子郵件未通過驗證(如上例所示),則會出現插入錯誤。如何捕獲錯誤類型? .error方法無法獲取任何錯誤參數。

+0

您可以打開SQL日誌sequelize。它會給你你試圖運行的查詢導致錯誤。也@Sriharsha是正確的,你需要指定參數的字符串,以console.log錯誤 –

回答

7

sequelize會將錯誤作爲參數傳遞給錯誤函數。

的JavaScript

User.findOrCreate({username: "johny",password: "pass",email: "johny93[###]example.com"}) 
.success(function(user, created){ 
    console.log(user.values); 
    res.send(200); 
}) 
.error(function(err){ 
    console.log('Error occured' + err); 
}) 

CoffeScript

globals.models.User.findOrCreate 
    username: "johny" 
    password: "pass" 
    email: "johny93[###]example.com" 
.success (user, created)-> 
    console.log user.values 
    res.send 200 
.error (error)-> 
    console.log error # how to catch this? 
    res.send 502 
+0

謝謝,我不能解釋爲什麼它以前沒有爲我工作。例如,作爲錯誤,我得到一個字符串'錯誤:ER_TRUNCATED_WRONG_VALUE_FOR_FIELD:錯誤的整數值:''在'行1'列'coreNumber'。我怎樣才能得到像錯誤代碼和行ID的smth?我需要這個來自動處理輸入錯誤,以顯示用戶的錯誤。或者手動插入數據庫之前驗證輸入會更好嗎? – f1nn

+0

您是否正在尋找一個正則表達式來將ER_TRUNCATED_WRONG_VALUE_FOR_FIELD和第1行拖出該錯誤字符串? – dankohn

13
User.findOrCreate({ 
    where: { 
    username: "johny", 
    password: "pass", 
    email: "johny93[###]example.com" 
    }, 
    defaults: { 
    //properties to be created 
    } 
}).then(function(user){ 
    var created = user[1]; 
    user = user[0]; 
    console.log(user.values); 
}).fail(function(err){ 
    console.log('Error occured', err); 
}); 

https://github.com/sequelize/sequelize/wiki/Upgrading-to-2.0

編輯:作爲@Domi指出,更好的方法是使用 '價差'在的 '然後'

User.findOrCreate({ 
    where: { 
    username: "johny", 
    password: "pass", 
    email: "johny93[###]example.com" 
    }, 
    defaults: { 
    //properties to be created 
    } 
}).spread(function(user, created){ 
    console.log(user.values); 
}).fail(function(err){ 
    console.log('Error occured', err); 
}); 
+1

根據您分享的鏈接,此代碼有效,但不推薦使用返回多個參數的方法。你可以使用'spread(user,created)'而不是'then(userAndCreatedInOneArray)'與'findOrCreate',來保存你在調用'user'(但實際上不是用戶)的數組。 – Domi

+2

@Domi好點,我修改了答案 – salexch

3

Sequelize 2.0修改語法和代替現在是

User.findOrCreate({ 
    where: { 
    username: 'johny', 
    password: 'pass', 
    email: 'johny93[###]example.com' 
    } 
}).then(function (user) { 
    res.send(200); 
}).catch(function (err) { 
    console.log(err); 
    res.send(502); 
}); 
+2

在Sequelize 3.0中,推薦用戶.spread()http://docs.sequelizejs.com/en/latest/api/model/#findorcreateoptions-promiseinstance-created – Kad