Javascript node.js是否在连接中发生更改?

Javascript node.js是否在连接中发生更改?,javascript,node.js,couchbase,Javascript,Node.js,Couchbase,我正在调试另一个程序员留给我维护的一些代码。我刚刚尝试从node.js 5升级到node.js 8,我的数据库查询是针对返回的一些带有key not found错误的请求 我们使用couchbase作为数据库,为了安全起见,我们的文档密钥被“加密”。因此,我们可能有一个像“用户”这样开始的密钥_myemail@gmail.com“但我们使用以下方法对其进行加密: function _GetScrambledKey(dbKey) { //select encryption key base

我正在调试另一个程序员留给我维护的一些代码。我刚刚尝试从node.js 5升级到node.js 8,我的数据库查询是针对返回的一些带有key not found错误的请求

我们使用couchbase作为数据库,为了安全起见,我们的文档密钥被“加密”。因此,我们可能有一个像“用户”这样开始的密钥_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;
}
在第5个节点中,这起作用,但在第8个节点中,我们得到一些文件返回良好,其他文件返回丢失。我将
“ECB_u2;”+encryptedKey
作为一个int数组输出,结果让我更加困惑。它们在NoDE5到NoDE8上是不同的,但在数组中间只有一个字符。

将encryptedKey作为int数组输出到两个版本上,可以看到这一点

188106,14227211,70,94,97,63130,78246155,65,6148,62215,47230211109,35,99,21,60178,74195,1323325318714221321104,58168,60225148,25101155,91122,77,2,99102235,26,71157,99,6,47162152,58181,21175

然后以同样的方式输出连接的字符串,结果会略有不同

这是node8的输出
Node8键:69,67,66,9565533106,1465553365533,70,94,97,6365533,786553365533,65,665533,6265533,476553365533109,35,99,21,6065533,7465533,136553365533665533365533104,5865533,6065533,25101655333,91122,77,2,99102655353533,26,7165533,65533,99,2165536,47655333,655333,655533

这是节点5的输出
Node5键:69,67,66,9565533106,1465553365533,70,94,97,6365533,786553365533,65,665533,6265533,476553365533109,35,99,21,6065533,7465533,136553365533665533365533104,5865533,60655655353533,25101165533,91122,77,2,99102655365533,99,6,6,655365533,6,65533,4665533,2165533

我必须通过一个diff工具运行它才能看到差异
与原始的预附加数组相比,节点8中的225似乎刚刚被删除。225重要吗?我无法理解,除非是一个bug,否则这怎么可能。有人有什么想法吗?

看起来这是v8 5.5中的一个变化

您面临的许多问题,包括连接可以使用节点8中提供的ES6的更新功能来清除

通常,应该避免使用
+
运算符进行字符串连接,而应该使用字符串文字。在您的情况下,您应该将
“ECB_u${encryptedKey}
替换为
`ECB_${encryptedKey}

此外,如果要从该串联字符串中输出整数值的内容,最好使用节点中的
.join
、扩展运算符(
..
)和
缓冲区
类,如下所示:

let encKey = `ECB_${encryptedKey}`;
let tmpBuff = Buffer.from(encKey);
let buffArrVals = [...tmpBuff];
console.log(buffArrVals.join(','));

此外,如果您可以帮助它,您确实应该避免在
函数
块中使用
var
,就像它存在于示例代码中一样
var
执行一种称为变量提升的操作,并使变量在声明的范围之外可用,这是很少使用的。从node 6+开始,建议对变量声明使用
let
const
,以确保它们的作用域保持在声明的块上。

在该行之前是否尝试过
console.log(typeof encryptedKey)
?如果它是一个字符串,concat是直接的。如果它是一个物体,那么有可能会有变化。我做了,是的。它是一个物体。我还运行了JSON.stringify,它在5和6中也是一样的
JSON:{“type”:“Buffer”,“data”:[26,66,54….]}
如果连接发生了变化,那么我需要找到一种方法来恢复原始功能复合对象的对象
toString
可能只会在这里返回
[object object]
。以前肯定不行。您确定
encryptedKey
以前只是一个数组,但您做了一些更改,现在它是
{type:…,data:…}
?我打赌你有
ECB_26,66,54
,但在这里做了一些更改之后,不知怎么的你遇到了一个问题。从外观上看
encryptedKey
是一个节点
Buffer
,它有一个
toString
方法,所以我认为你不会得到
[对象]
。他们给出的示例是它的JSONified表示,而不是对象的实际结构@RealWorld-我建议检查
encryptedKey.toString()
是否在两个版本上返回相同的值。此外,如果你看到老程序员,就给他一记耳光,因为他依赖于节点的默认字符串表示形式,而不改变:p
let encKey = `ECB_${encryptedKey}`;
let tmpBuff = Buffer.from(encKey);
let buffArrVals = [...tmpBuff];
console.log(buffArrVals.join(','));