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+ 开始,建议使用 letconst 进行变量声明,以确保它们保持在声明的块范围内。