node.js 串联变化?
node.js change in concatenation?
我正在尝试调试其他程序员留给我维护的一些代码。我刚刚尝试从 node.js 5 升级到 node.js 8,我的数据库查询是针对 一些 请求返回的,但没有找到密钥错误
我们正在为数据库使用 couchbase,为了安全起见,我们的文档密钥是 "encrypted"。所以我们可能有一个这样开头的密钥 "User_myemail@gmail.com" 但我们使用以下方法对其进行加密:
function _GetScrambledKey(dbKey)
{
//select encryption key based on db key content
var eKeyIndex = CalculateEncryptionKeyIndex(dbKey, eKeys.length);
var sha = CalculateSHA512(dbKey + eKeyIndex);
return sha;
}
function CalculateEncryptionKeyIndex(str, max)
{
var hashBuf = CalculateSHA1(str);
var count = 0;
for (var i = 0; i < hashBuf.length; i++)
{
count += hashBuf[i];
count = count % max;
}
return count;
}
然后我们使用
在 couchbase 中查询文档
cb.get("ECB_"+encryptedKey, opts, callback);
在 node5 中,这有效,但在 node8 中,我们得到一些文档 return 正常,而其他文档 return 丢失。我将 "ECB_"+encryptedKey
作为一个 int 数组输出,结果只会让我更加困惑。它们在 node5 到 node8 上不同,但仅在数组中间有一个字符。
在两个版本上将 encryptedKey 作为 int 数组输出表明了这一点
188,106,14,227,211,70,94,97,63,130,78,246,155,65,6,148,62,215,47,230,211,109,35,99,21,60,178,74,195,13,233,253,187,142,213,213,104,58,168,60,225,148,25,101,155,91,122,77,2,99,102,235,26,71,157,99,6,47,162,152,58,181,21,175
然后输出拼接后的字符串,同样的方式,结果略有不同
这是node8的输出
Node8 key: 69,67,66,95,65533,106,14,65533,65533,70,94,97,63,65533,78,65533,65533,65,6,65533,62,65533,47,65533,65533,109,35,99,21,60,65533,74,65533,13,65533,65533,65533,65533,65533,65533,104,58,65533,60,65533,25,101,65533,91,122,77,2,99,102,65533,26,71,65533,99,6,47,65533,65533,58,65533,21,65533
这是node5的输出
Node5 key: 69,67,66,95,65533,106,14,65533,65533,70,94,97,63,65533,78,65533,65533,65,6,65533,62,65533,47,65533,65533,109,35,99,21,60,65533,74,65533,13,65533,65533,65533,65533,65533,65533,104,58,65533,60,65533,65533,25,101,65533,91,122,77,2,99,102,65533,26,71,65533,99,6,47,65533,65533,58,65533,21,65533
我不得不 运行 通过 diff 工具来查看差异
将其与原始的预追加数组进行比较,看起来 225 刚刚被删除到 node8 中。 225重要吗?除非它是一个错误,否则我无法理解这怎么可能。有人有什么想法吗?
看起来这是 v8 5.5 中的更改 https://github.com/nodejs/node/issues/21278
您面临的很多问题,包括连接,都可以使用节点 8 中提供的 ES6 中的更新功能来解决。
一般来说,您应该避免使用 +
运算符进行字符串连接,而应该改用字符串文字。在您的情况下,您应该将 "ECB_"+encryptedKey
替换为 `ECB_${encryptedKey}`
.
此外,如果你想从这个连接的字符串中输出整数值的内容,那么你最好使用 .join
、扩展运算符 (...
) 和 Buffer
class 从节点如下:
let encKey = `ECB_${encryptedKey}`;
let tmpBuff = Buffer.from(encKey);
let buffArrVals = [...tmpBuff];
console.log(buffArrVals.join(','));
此外,如果可以的话,您真的应该避免在 function
块内部使用 var
,就像您的示例代码中存在的那样。 var
执行称为变量提升的操作,并导致变量在其声明的范围之外变得可用,这很少是有意的。从节点 6+ 开始,建议使用 let
或 const
进行变量声明,以确保它们保持在声明的块范围内。
我正在尝试调试其他程序员留给我维护的一些代码。我刚刚尝试从 node.js 5 升级到 node.js 8,我的数据库查询是针对 一些 请求返回的,但没有找到密钥错误
我们正在为数据库使用 couchbase,为了安全起见,我们的文档密钥是 "encrypted"。所以我们可能有一个这样开头的密钥 "User_myemail@gmail.com" 但我们使用以下方法对其进行加密:
function _GetScrambledKey(dbKey)
{
//select encryption key based on db key content
var eKeyIndex = CalculateEncryptionKeyIndex(dbKey, eKeys.length);
var sha = CalculateSHA512(dbKey + eKeyIndex);
return sha;
}
function CalculateEncryptionKeyIndex(str, max)
{
var hashBuf = CalculateSHA1(str);
var count = 0;
for (var i = 0; i < hashBuf.length; i++)
{
count += hashBuf[i];
count = count % max;
}
return count;
}
然后我们使用
在 couchbase 中查询文档cb.get("ECB_"+encryptedKey, opts, callback);
在 node5 中,这有效,但在 node8 中,我们得到一些文档 return 正常,而其他文档 return 丢失。我将 "ECB_"+encryptedKey
作为一个 int 数组输出,结果只会让我更加困惑。它们在 node5 到 node8 上不同,但仅在数组中间有一个字符。
在两个版本上将 encryptedKey 作为 int 数组输出表明了这一点
188,106,14,227,211,70,94,97,63,130,78,246,155,65,6,148,62,215,47,230,211,109,35,99,21,60,178,74,195,13,233,253,187,142,213,213,104,58,168,60,225,148,25,101,155,91,122,77,2,99,102,235,26,71,157,99,6,47,162,152,58,181,21,175
然后输出拼接后的字符串,同样的方式,结果略有不同
这是node8的输出
Node8 key: 69,67,66,95,65533,106,14,65533,65533,70,94,97,63,65533,78,65533,65533,65,6,65533,62,65533,47,65533,65533,109,35,99,21,60,65533,74,65533,13,65533,65533,65533,65533,65533,65533,104,58,65533,60,65533,25,101,65533,91,122,77,2,99,102,65533,26,71,65533,99,6,47,65533,65533,58,65533,21,65533
这是node5的输出
Node5 key: 69,67,66,95,65533,106,14,65533,65533,70,94,97,63,65533,78,65533,65533,65,6,65533,62,65533,47,65533,65533,109,35,99,21,60,65533,74,65533,13,65533,65533,65533,65533,65533,65533,104,58,65533,60,65533,65533,25,101,65533,91,122,77,2,99,102,65533,26,71,65533,99,6,47,65533,65533,58,65533,21,65533
我不得不 运行 通过 diff 工具来查看差异
看起来这是 v8 5.5 中的更改 https://github.com/nodejs/node/issues/21278
您面临的很多问题,包括连接,都可以使用节点 8 中提供的 ES6 中的更新功能来解决。
一般来说,您应该避免使用 +
运算符进行字符串连接,而应该改用字符串文字。在您的情况下,您应该将 "ECB_"+encryptedKey
替换为 `ECB_${encryptedKey}`
.
此外,如果你想从这个连接的字符串中输出整数值的内容,那么你最好使用 .join
、扩展运算符 (...
) 和 Buffer
class 从节点如下:
let encKey = `ECB_${encryptedKey}`;
let tmpBuff = Buffer.from(encKey);
let buffArrVals = [...tmpBuff];
console.log(buffArrVals.join(','));
此外,如果可以的话,您真的应该避免在 function
块内部使用 var
,就像您的示例代码中存在的那样。 var
执行称为变量提升的操作,并导致变量在其声明的范围之外变得可用,这很少是有意的。从节点 6+ 开始,建议使用 let
或 const
进行变量声明,以确保它们保持在声明的块范围内。