2017-02-23 18 views
0

こんにちは誰かが私のコードを見れますか?私はバックエンドで認証を実装しています。JavaScriptの理解を深めるためのサイドプロジェクトとして構築しています。難しさを扱うjavascriptの約束

なぜ私はmongoose findからの約束が未定義を返すのか分かりません。

私には2つの機能があります。 1つはコントローラに渡されるヘルプ機能です。

import db from '../models'; 
import bcrypt from 'bcrypt'; 
import validateLogin from '../validations/login'; 
import isEmpty from 'lodash/isEmpty'; 
const loginController = {}; 

loginController.login = function(req,res){ 
    validateLogin(req.body).then(({isValid, errors }) => { 
    // isValid is undefined here 
    // This is the problem 
     if(isValid){ 
      // give token 
      res.status(200).json({ 
       success: true, 
      token: 'here is your token' 
      }); 
     } else { 
      res.status(401).json({ 
      errors 
      });  
     }  
    }).catch(err =>{ 
     console.log(err) 
    });  
}; 

export default loginController; 

もう1つは、ヘルパー関数が有効または無効の応答を返すかどうかによってトークンを使用するコントローラ機能です。

import validator from 'validator'; 
    import db from '../models'; 
    import isEmpty from 'lodash/isEmpty'; 
    import bcrypt from 'bcrypt'; 

    function validateLogin(data){ 
     const { userInput, password } = data; 
     const errors = {}; 
     if(validator.isEmpty(userInput)){ 
     errors.userInput = 'username is required'; 
     } 
     if(validator.isEmpty(password)){ 
     errors.password = 'password is required'; 
     } 
     return db.User.find({$or:[{ username: userInput }, { email: userInput }]}).then(existingUser =>{ 
     if(existingUser.length > 0){ 
      // User exists, check if password matches hash 
      const user = existingUser[0]; 
      bcrypt.compare(password, user.password_digest).then(valid => { 
       if(!valid){ 
        errors.password = 'Invalid Password'; 
       } 
       console.log('from prmomise'); 
       return { 
        isValid: isEmpty(errors), 
        errors 
       }; 
      }).catch(err => console.log(err)); 
      } else { 
      errors.userInput = 'username or email does not exist'; 
      return { 
       isValid: isEmpty(errors), 
       errors 
      }; 
      } 
     }); 
    } 

    export default validateLogin 
+1

*現実の生活の中での約束* :-p – Rajesh

+1

downvotesはなぜですか? – Nate

+0

約束は約束@Rajesh^_^ – Deep

答えて

1

returnbcryptコールのために欠けているように見えます。それがなければ

return bcrypt.compare(password, user.password_digest).then(valid => { 
    // password check and returning result object 
}).catch(err => console.log(err)); 

あなたvalidateLogin機能が最終的に解決さundefined約束を返します。

+0

'最終的には未定義を返す' - いいえ、 'validateLogin'は約束を返します...この約束は' db.User.find'の後の '.then'が終わると' undefined'に解決されます。 :p –

+0

Thx、そうです、それが私の意図です。それを私が直した。 – lex82

+0

素晴らしい!何が大統領が私にスリップアップ。私はこの問題を解決しようとしている2時間強かった – Nate