我正在使用bcryptjs包对密码进行哈希和比较。
下面使用的comparesync
方法是同步的,并返回一个布尔值。它是可靠的和工作的预期。
let trueOrFalse = bcrypt.compareSync('abcd', '1234');
if(trueOrFalse) {
console.log('hooray, it was true');
} else {
console.log('oops, it was false');
}
下一个示例使用异步compare
方法。我担心的是,由于此版本是异步的,如果服务器上有任何延迟,它可能会在bcrypt.compare
确定res
的值之前到达if/else
语句。这是一个合理的担心,还是我误解了这种类型的异步函数的性质?
let trueOrFalse;
bcrypt.compare('abcd', '1234', function(err, res) {
trueOrFalse = res;
}
if(trueOrFalse) {
console.log('hooray, it was true');
} else {
console.log('oops, it was false');
}
node.js运行时肯定会在得到异步计算的结果之前运行同步代码(if-else语句)。可以保证计算只在回调函数中完成:
bcrypt.compare('abcd', '1234', function(err, res) {
// make your checks here
if (res) {
// ...
}
})
异步方法将与您的主程序并行执行,因此您的console.log
将在bcrypt.compare
内的回调函数之前完成。你会看到总是‘哎呀,这是假的’。
您可以在主函数中等待真正的结果,然后在控制台中显示一些内容。
要使比较“可等待”,可以将其包装到promise
:
function compareAsync(param1, param2) {
return new Promise(function(resolve, reject) {
bcrypt.compare(param1, param2, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
}
const res = await compareAsync(param1, param2);
console.log(res);
我更喜欢将遗留的回调函数封装到承诺中,因为这将使应用程序免于回调地狱。
据我所知,<code>override</code>关键字声明给定的声明实现了一个基本<code>virtual</code>方法,如果没有找到匹配的基本方法,编译应该失败。 我对< code>final关键字的理解是,它告诉编译器任何类都不能覆盖这个< code >虚拟函数。 那么是多余的吗?它似乎编译得很好。最终传达哪些信息而信息不传达?这种组合的用例是什么?
当服务器响应附带“content-encoding:gzip”时,是否一定意味着响应主体是gzip格式的?我正在解码传入的响应正文(可能不正确),并得到一个“不在GZIP格式”异常。
我想要一个方法来处理实现特定接口的任何类型的列表。 此实用程序方法可以加密任何实现加密表的域类的列表。 我写了一个测试应用程序,这似乎是可行的。我关心的是Java关键字“extends”。我的类不扩展可加密,而是实现它。我写的东西真的有用吗?或者我是做错事但得到正确答案的某种副作用的受害者。
Java宣布一个集合为最终集合意味着什么?是不能再添加更多元素了吗?是已经存在的元素不能更改吗?是别的什么吗?
我刚刚浏览了一些代码,我看到了以下方法
我想创建一个