2016-12-03 66 views
0

我想测试我的密码哈希函数,但由于某些TypeError错误,我一直在获取失败。摩卡在测试node.crypto函数时抛出错误

我相信,因为我试图从一些其他的文件称之为功能工作,我得到预期的结果没有任何错误。

下面是函数:

exports.hashPassword = (password) => { 
     return new Promise((resolve, reject) => { 

     crypto.randomBytes(salt_length, (err, buf) => { 
      if (err) reject(err); 

      const salt = buf.toString('base64'); 

      crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, key) => { 
      if (err) reject(err); 

      const hashedPassword = '{X-PBKDF2}:'+digest+':'+keylenB64+':'+iterationsB64+':'+salt+':'+key.toString('base64'); 
      resolve(hashedPassword); 
      }); 
     }); 
     }); 
    }; 

这里是一个失败的试验:

describe('users',() => { 

     describe('utils',() => { 

     it('should hash a password', (done) => { 

      const password = 'secret'; 

      utils.hashPassword('secret') 
      .then((hash) => { 
      console.log('Hash: '+ hash); 
      done(); 
      }) 
      .catch((err) => { 
      console.log(err); 
      done(err); 
      }); 
     }); 
     }); 
    }); 

这是 '错误':

1 failing 

1) users utils should hash a password: 
    TypeError: size must be a number >= 0 
    at Promise (api\paths\users\utils.js:24:12) 
    at Object.exports.hashPassword (api\paths\users\utils.js:14:10) 
    at Context.it (api\paths\users\utils.test.js:30:13) 

有任何人任何想法,为什么?

我使用mochashouldnode发展。

+0

目前还不清楚这是投掷错误的功能。你能澄清吗? – pietrovismara

+0

当然,只有一个函数hashPassword()驻留在一个名为utils.js的文件中。现在,如果你问在'Promise(api \ paths \ users \ utils.js:24:12)'错误指向哪里,那么这是第一次使用加密'crypto.randomBytes' – Johnny

+1

嗯,我想你已经已经检查你传递给crypto.randomBytes的大小是否等于或大于0? – pietrovismara

回答

1

由于pietrovismara是指出我朝着解决方案。

的问题是,salt_length是一个字符串,而不是一个数字。我打印出来的论点,我可以看到他们是'正确的',但显然不是正确的类型(因此TypeError,我猜...)

我保留在.env文件中的参数,我用dotenv包显然读取它们作为简单的字符串(因为它应该)...当我从另一个文件'测试'功能时,它工作的原因是,在那种情况下,我没有使用从.env读取的参数,I碰到这样的:

const salt_length = process.env.SALT_LENGTH || 128;

摩卡是correclty使用.env值(字符串),但愚弄时围绕文件我没有加载这些环境变量。

我今天学到了一些东西,这是我应该回家累了,而不是充电并没有看到我眼前的事情时。

另外,由于mocha支持用,“正确的”测试案例应该是(使用should):

describe('users',() => { 

    describe('utils',() => { 

     it('should hash a password',() => { 
     return utils.hashPassword('secret').should.be.fulfilled(); 
     }); 

    }); 
    }); 
+1

您甚至可以删除'.catch()'并让Mocha为您处理它。 – robertklep

+1

@robertklep看到我编辑的代码;) – Johnny