当前位置:  开发笔记 > 编程语言 > 正文

从内部函数传递到外部函数 - 无法保存密码

如何解决《从内部函数传递到外部函数-无法保存密码》经验,为你挑选了1个好方法。

我尝试哈希密码,crypto我无法将它们保存在数据库中.

我有node.js 4.2.3 express 4.13.3,我的数据库是PostgreSQL 9.1.该字段是character varying (255)并且被命名pswrd.

这是我的代码:

var tobi = new User({
    usrnm:'sp',
    pswrd:'an'
});

module.exports = User;

function User(obj){
    for(var key in obj){
        this[key] = obj[key];
    }
}

User.prototype.save = function (fn){
    var user=this;
     //EDIT, added this :
     var psw ;
    var salt = crypto.randomBytes(50).toString('base64');
    crypto.pbkdf2(user.pswrd, salt, 10000, 150, 'sha512',function(err, derivedKey) {
        //user.pswrd = derivedKey.toString('hex');
         //EDIT, added this:
         var justCrypted = derivedKey.toString('hex');
    });

    var query=client.query('INSERT INTO mytable(usrnm,pswrd)VALUES($1,$2) RETURNING mytable_id',[user.usrnm,user.pswrd], function(err, result) {
        if(err) {console.log(err)}
        else {
          var newlyCreatedId = result.rows[0].mytable_id;
        }
    });
    query.on("end", function (result) {console.log(result);client.end();});
}

tobi.save(function (err){
    if (err)throw error;
    console.log("yo");
})  

要运行它,我输入node lib/user.我没有错误,但密码未正确保存.第一个值被保存,而an不是哈希值.我在这里错过了什么?

编辑

AshleyB答案很好,但是,请帮助我理解如何将数据从内部函数(crypto.pbkdf2)传递到其外部(User.prototype.save = function (fn)),当内部具有预定义,固定语法(crypto.pbkdf2)时,所以我不知道是否或如何编辑它.

如何保留代码并仍然justCrypted返回psw(请参阅代码编辑)?如果它是我写的一个函数,我可以使用apply我猜,但是,crypto.pbkdf2被预测,我不知道是否可以添加东西.

谢谢



1> Ashley B..:

问题在于范围,当前查询更改的user.pswrd超出了查询范围,因此它回退到顶部指定的值.

通过在'crypto.pbkdf2'...块内移动查询,user.pswrd值将按预期工作.我已经更新了你的代码(并使salt生成异步,因为你已经使用了异步版本的pbkdf2).

var tobi = new User({
  usrnm: 'sp',
  pswrd: 'an'
});

module.exports = User;

function User(obj) {
  for (var key in obj) {
    this[key] = obj[key];
  }
}

User.prototype.save = function(fn) {
  var user = this;


  // Changed salt generation to async version
  // See: https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callback

  crypto.randomBytes(50, function(ex, buf) {
  if (ex) throw ex;
  salt = buf.toString('base64');

    // password, salt, iterations, keylen[, digest], callback
    crypto.pbkdf2(user.pswrd, salt, 10000, 150, 'sha512', function(err, derivedKey) {
    user.pswrd = derivedKey.toString('hex');

        // Moved the query within the hash function
    var query = client.query('INSERT INTO mytable(usrnm,pswrd)VALUES($1,$2) RETURNING mytable_id', [user.usrnm, user.pswrd], function(err, result) {
      if (err) {
        console.log(err)
      } else {
        var newlyCreatedId = result.rows[0].mytable_id;
      }
    });
    query.on("end", function(result) {
      console.log(result);
      client.end();
    });

  });


    });

}


tobi.save(function(err) {
  if (err) throw error;
  console.log("yo");
})

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有