【问题标题】:Difficulty handling Promises in javascript在 javascript 中难以处理 Promise
【发布时间】:2017-07-13 11:46:41
【问题描述】:

您好,有人可以看看我的代码吗?我正在作为一个辅助项目构建的后端实现身份验证,以提高我对 JavaScript 的理解。

我不确定为什么来自 mongoose find 的承诺返回未定义。

我有两个需要帮助的功能。一个是将传递给控制器​​的帮助函数。

 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;

另一个是控制器函数本身,它将根据辅助函数是否返回有效响应来发出令牌。

  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

【问题讨论】:

  • 在现实生活中处理 Promise 的难度 :-p
  • 为什么投反对票?
  • 承诺就是承诺@Rajesh ^_^

标签: javascript node.js mongoose promise


【解决方案1】:

bcrypt 调用似乎缺少 return

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

没有它,您的validateLogin 函数最终会返回一个解析为undefined 的承诺。

【讨论】:

  • eventually returns undefined - 不,validateLogin 返回一个承诺...当.thendb.User.find 之后完成时,此承诺将解析为undefined:p
  • 谢谢,你是对的,这就是我的意思。我修好了。
  • 太棒了!我犯了多大的错误。我花了整整两个小时试图解决这个问题
猜你喜欢
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多