2015-12-31 2 views
1

Поэтому у меня есть этот кодне может получить значение функции

User.prototype.save = function (fn){ //User is just an object 
     var password = hashPassword(null, this.pswrd); 

     var query=client.query('INSERT INTO myUser(usrnm,pswrd)VALUES($1,$2) ,[this.name,password], function(err, result) { 
      if(err) {console.log(err)} 
     }); 
     query.on("end", function (result) {client.end();});  
    } 

и hashPassword является

версия 1

function hashPassword(salt,pass){ 
    var salt = salt?salt:new Buffer(crypto.randomBytes(128)).toString('hex'); 
    var pass = pass; 
    var a=crypto.pbkdf2(pass, salt , 10000, 256, 'sha512',function(err, derivedKey) { 
     return salt + (new Buffer(derivedKey).toString('hex')); 
    }); 
    return a; 
} 

я a и password, undifined. Я использую return, поэтому, почему может только a взять значение?

версия 2

function hashPassword(salt,pass){ 
    var salt = salt?salt:new Buffer(crypto.randomBytes(128)).toString('hex'); 
    var pass = pass; 
    crypto.pbkdf2(pass, salt , 10000, 256, 'sha512',function(err, derivedKey) { 
     pass = salt + (new Buffer(derivedKey).toString('hex')); 
     console.log("pass in > "+pass); 
    }); 
    console.log("pass out > "+pass); 
    return pass; 
} 

я pass in > fhjvoefvuhvuoedfv... (is hashed correctly), но pass out > undefined. Теперь pass является глобальным до hashPassword, и я изменил его значение внутри crypto, так почему он его не сохраняет?

версия 3

function hashPassword(salt,pass){ 
    var salt = salt?salt:new Buffer(crypto.randomBytes(128)).toString('hex'); 
    var pass = pass; 
    var pass2; 
    crypto.pbkdf2(pass, salt , 10000, 256, 'sha512',function(err, derivedKey) { 
     pass2 = salt + (new Buffer(derivedKey).toString('hex'));  
     console.log("pass2 in > "+pass2); 
    }); 
    console.log("pass2 out > "+pass2); 
    return pass2; 
} 

Итак, я попытался решить проблему Version2 путем добавления дополнительного вар и я получаю pass2 in > fhjvoefvuhvuoedfv... (is hashed correctly), но pass2 out > undefined. Как это возможно?

версия 4

Согласно первому ответу here Я попробовал:

var password ; 
hashPassword(null, user.pswrd,function(p) 
{ 
    password=p; 
} 
); 

console.log("password > "+password); 

и

function hashPassword(salt,pass, fn){ 
    var salt = salt?salt:new Buffer(crypto.randomBytes(128)).toString('hex'); 
    var pass = pass; 
    crypto.pbkdf2(pass, salt , 10000, 256, 'sha512',function(err, derivedKey) { 
     fn(salt + (new Buffer(derivedKey).toString('hex')));  
    }); 
} 

и password является undefined.

Так что, пожалуйста, я пробовал, и я пробовал и все еще ничего, объясните и покажите мне, что делать.

Благодаря

ответ

0

hashPassword по-прежнему является функцией асинхронной. Вы должны использовать его так:

var password ; 
hashPassword(null, user.pswrd, function(p) { 
    password=p; 
    console.log("password > "+password); 
}); 

ли остальную часть вашей работы внутри обратного вызова (обратный вызов функции вы передаете другую функцию, чтобы назвать, читайте this). Итак, если у вас есть фрагмент кода, который должен быть инициализирован password, поместите их внутри обратного вызова. Это место, которое будет выполнено, когда значение password.

Прочтите this thread и помните, что ваша функция также является функцией async.

Если у вас есть функция асинхронизации где-то в цепочке вызовов функций, вся ваша задача становится асинхронной.

function f(callback) { 
    function g() { 
    function h() { 
     function asyncFunction() { 
     var returnValue = 'something'; 
     callback(returnValue); 
     } 
     asyncFunction() 
    } 
    h(); 
    } 
    g(); 
} 

Когда у вас есть функция обратного вызова callback, и вы вызываете функцию асинхронной и передавая функцию обратного вызова к нему, вы не должны ожидать, что ваша функция обратного вызова будет вызываться перед остальной частью кода.

function f(callback) { 
    var returnValue = 'something'; 
    // setTimeout is to just simulate an async function 
    setTimeout(function() { 
    callback(returnValue); 
    }, 0) 
} 


console.log("first log") 

f(function (data) { 
    console.log("third log"); 
    console.log(data) 
}); 

console.log("second log") 

Порядок регистрации в приведенном выше кодексе показывает вам порядок. second log будет напечатан до third log, так как f является асинхронной функцией, функция обратного вызова будет вызываться позже, когда результат будет готов, а остальная часть кода будет выполнена и не будет заблокирована для результата f.

+0

Код, который вы предлагаете, выглядит как моя версия 4. Можете ли вы быть более конкретным? Кроме того, я не совсем понимаю это: «Делайте остальную часть своей работы внутри обратного вызова». Какая работа и какой обратный вызов? Спасибо – user2860857

+0

@ user2860857 Я только что обновил свой ответ. Пожалуйста, не стесняйтесь спрашивать, есть ли у вас больше вопросов об этом. –

+0

Итак, если я получил его, вы имеете в виду, продолжайте всю работу внутри этого 'hashPassword (null, user.pswrd, function (p) { password = p; console.log (" password> "+ password); }); Я обновил свой первоначальный вопрос. Должен ли я передавать запрос внутри 'hashPassword (null, user.pswrd, function (p) {....'? Почему запрос может получить значение 'password'? Область функций? Есть ли способ оставить код как есть в моем вопросе и передать значение запросу? Спасибо – user2860857

Смежные вопросы