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