所以我有这个代码
>>> for i in session.execute('select id from parents limit 1'):
print i
(147194, )
>>> p = session.query(Parent).get(147194)
>>> p == None
True
>>> c = Child()
>>> c.parent_id = 147194
>>> session.add(c)
>>> session.commit()
>>> p = session.query(Parent).get(147194)
>>> p == None
False
而 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();});
}
是
版本1
hashPassword
我得到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
取值?
第2版
a
我得到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
来说是全局的,我在crypto中更改了它的值,为什么它不保留呢?
第3版
hashPassword
所以,我尝试通过添加额外的var来解决版本2问题,我得到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;
}
,但pass2 in > fhjvoefvuhvuoedfv... (is hashed correctly)
。这怎么可能?
第4版
根据第一个回答here我尝试过:
pass2 out > undefined
和
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
。
所以,拜托,我试过,我尝试了但仍然没有,请解释并告诉我该怎么做。
由于
答案 0 :(得分:0)
<ul id="my-ul" class="pager">
<li><a href="#">A</a>
</li>
<li><a href="#">B</a>
</li>
<li><a href="#">C</a>
</li>
<li><a href="#">D</a>
</li>
<li><a href="#">E</a>
</li>
<li><a href="#">F</a>
</li>
<li><a href="#">G</a>
</li>
<li><a href="#">H</a>
</li>
<li><a href="#">I</a>
</li>
</ul>
仍然是异步功能。你应该这样使用它:
hashPassword
在回调中完成剩余的工作(回调是您传递给另一个要调用的函数的函数,读取this)。因此,如果您有一段需要初始化var password ;
hashPassword(null, user.pswrd, function(p) {
password=p;
console.log("password > "+password);
});
的代码,请将它们放在回调中。这是password
有价值时将要执行的地方。
再次阅读this thread并牢记这一点,您的功能也是异步功能。
如果在函数调用链的某处有异步函数,则整个任务变为异步。
password
当你有一个回调函数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
的结果。