2017-05-23 1 views
0

저는 NodeJS를 처음 사용합니다. 비동기 NodeJS에 대한 많은 질문이 있지만 정확히 무엇을 찾고 있는지 알 수 없습니다.내 기능을 NodeJS에서 비동기 적으로 실행

내 문제는 : 내 데이터베이스에 사용자 이름과 전자 메일이 이미 있는지 확인하고 싶습니다. 사용자 이름과 이메일을위한 두 개의 개별 기능. 또 다른 기능은 데이터를 데이터베이스에 저장하는 것입니다.

비동기 NodeJS 패턴을 사용하여이를 수행하는 방법을 알지 못합니다.

의 user.js (몽구스 스키마)

const mongoose = require('mongoose'); 
var userSchema = mongoose.Schema({ 
    name: String, 
    username: { type: String, required: true, unique: true }, 
    password: { type: String, required: true }, 
    email: { type: String, required: true, unique: true}, 
    aiub_id: String,  
}); 
const Users = module.exports = mongoose.model('User', userSchema); 

module.exports.addUser = function (user, callback) { 
    user.save(callback); 
} 
module.exports.usernameExist = function (givenUsername, callback) { 
    Users.find({ username: givenUsername }, callback); 
} 
module.exports.emailExist = function (givenEmail, callback) { 
    Users.find({ username: givenEmail}, callback); 
} 

하는 index.js (경로)

route.post('/signup', function(req, res){ 
// GRAB USER INFO FROM HTML FORM 
var newUser = new User({ 
    name : req.body.tfullName, 
    username : req.body.tusername, 
    password : req.body.tpassword,  
    email : req.body.temail, 
    aiub_id : req.body.tuserID 
}); 

// This block send 200 if username doesn't exist 
User.usernameExist(newUser.username, function (err, result){ 
    if(err){ 
     throw err; 
    } 
    if(result.length <= 0){ 
     res.send({status : 200 }); 
    }else{ 
     res.send({status : 100 }); 
    } 
}); 

}); 

내가이 문제를 해결하는 데 도움이 바랍니다하고 바보 같은 소리하면 용서해주십시오.

+1

여기서'$ or'를 사용하여 단일 쿼리를 실행할 수 있습니다. 그렇다면 체인 콜백에 대해 걱정할 필요가없고 ** 오버 헤드가 적고 빠릅니다. 또는 "중복 오류"가 반환되면 고유 속성 중 하나가 실제로 존재한다는 사실을 받아 들일 수 있으며 사용자에게 다시 시도하도록 요청할 수도 있습니다. –

답변

2

Promise을 사용하십시오.

먼저 당신이 복용 콜백 대신 약속을 반환하도록 함수를 변경 제안 :

function userExists(parameters) { 
    return new Promise((resolve, reject) => 
    Users.find(parameters, (err, result) => { 
     if(err){ 
     reject(err); 
     } else { 
     resolve(result.length <= 0); 
     } 
    }) 
); 
} 

module.exports.usernameExist = function (givenUsername) { 
    return userExists({ username: givenUsername }); 
} 

module.exports.emailExist = function (givenEmail) { 
    return userExists({ email: givenEmail }); 
} 

그런 다음 해결하는 새로운 약속을 반환하는 Promise.all, 이러한 함수 • 병렬 호출에서 반환 약속을 포장 모든 포장 약속 한 후 해결하고 얻을 당신이 당신의 물건을 할 : 당신이 User 모듈에서 기능을 변경하지 않으려면

Promise.all([ 
    User.usernameExist(newUser.username), 
    User.emailExist(newUser.email) 
]).then((results) => { 
    // results[0] contains the result from User.usernameExist 
    // results[1] contains the result from User.emailExist 
}); 

, 당신은 그 FUNC에 대한 호출을 래핑 할 수 대신 index.js 파일에 Promise이 들어 있습니다.

+0

답변 해 주셔서 감사합니다. 이것은 매우 가독성이 있습니다. 그것이 나에게 효과가 있는지 아닌지 확인하겠습니다. –

0

그냥

// Check if username doesn't exist 
User.usernameExist(newUser.username, function (err, result){ 
    if(err){ 
     throw err; 
    } 
    if(result.length <= 0){ 

     //check if email doesn't exist 
     User.emailExist (newUser.email, function(err, result){ 
      if(result.length<=0){ 

       //save user 
       User.addUser(newUser, (err, result)=>{ 
        if(!err){ 
         res.send({status : 200 }); 
        }else{ 
         res.send({status : 100 }); 
        } 
       }) 
      } 
     } 
    } 
}); 

사람들은 당신이 당신의 함수에서 약속을 반환해야합니다 약속 사용, 콜백 약속을 선호하는 다른 콜백에서 하나 개의 함수를 호출합니다. 약속 코드는 읽기 쉽습니다.

+0

유효한 비동기 방식입니까? 바보 같으면 미안해! –

+1

이것은 비동기의 힘을 이용하지 않습니다. –

+0

@MikaelLennholm이 문제에 대해 다른 방법을 제공해 주시겠습니까? – nrgwsth

관련 문제