2013-09-25 12 views
7

나는 ORM으로 Sequelize을 사용하고 있습니다. 이메일이 유효하면get .findOrCreate() 오류

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 

: 나는 사용자를 저장하고있어

### 
    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 

: 여기 내 사용자 모델이다 (이메일 : "[email protected]"), 모든 것이 잘 작동합니다. 그러나 이메일이 유효성 검사에 실패하면 (위의 예와 같이) 삽입 오류가 발생합니다. 오류 유형을 잡는 방법? .error 메서드는 오류 매개 변수를 가져올 수 없습니다.

+0

당신이 sequelize에 대한 SQL 로그를 켤 수있을 것이다. 실행하려고하는 쿼리가 오류의 원인이됩니다. 또한 @Sriharsha는 당신이 argty 문자열을 console.log 오류 –

답변

7

sequelize는 오류를 매개 변수로 전달합니다.

자바 스크립트 :

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); 
}) 

커피 스크립트 :

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

에 고쳐 주어야한다고 명시하는 것이 맞습니다. 왜 저에게 전에 효과가 없었는지 설명 할 수 없습니다. 예를 들어 오류로 나는 'Error : ER_TRUNCATED_WRONG_VALUE_FOR_FIELD : 잘못된 정수 값 :' '열'의 'coreNumber'열에 문자열을 얻습니다. 어떻게하면 오류 코드와 행 ID 같은 smth을 얻을 수 있습니까? 입력 오류를 자동으로 처리하여 사용자에게 오류를 표시하려면이 기능이 필요합니다. 아니면 수동으로 DB에 삽입하기 전에 입력을 검증하는 것이 더 낫지 않을까요? – 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

공유 한 링크에 따르면이 코드는 작동하지만 여러 인수를 반환하는 메서드를 사용하는 것이 좋습니다. 'findOrCreate'와 함께'then (userAndCreatedInOneArray)'대신'spread (user, created)'를 사용하여'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