我的应用会收到一个也加密的base64编码值。数据可以有几种不同的方式,因此我想创建可链式的方法来保持代码的清洁和模块化。
我希望能够写下:decryptionChain.decodeBase64(b64Value).stringToBuffer().finallyDecrypt();
当我运行代码时,最后一个属性方法" finallyDecrypt"返回为undefined。
为什么" finallyDecrypt
"方法回归未定义?其余的都有效,如果我运行encryptionChain.decodeBase64(b64Value).stringToBuffer()
,我会回到我期望的缓冲区。只有当finallyDecrypt
被链接在一起时我才会出错。
以下是代码:
function decrypt(encrypted) {
var decipher = crypto.createDecipheriv(algorithm, password, iv);
decipher.setAuthTag(encrypted.tag);
var dec = decipher.update(encrypted.content, 'hex', 'utf8');
dec += decipher.final('utf8');
return dec;
}
var decryptionChain = {
currentValue:"",
decodeBase64: function (encryptedValue){
this.currentValue = new Buffer(encryptedValue.toString(), "base64");
return this;
},
stringToBuffer: function() {
if (this.currentValue) {
myBuffer = JSON.parse(this.currentValue, function (key, value) {
return value && value.type === 'Buffer'
? new Buffer(value.data)
: value;
});
}
return myBuffer;
},
finallyDecrypt : function(myBuffer){
if(myBuffer){
decrypt(myBuffer);
}
return this;
}
};
答案 0 :(得分:3)
链接的工作方式是从每个方法返回this
(指向decryptionChain
对象)。
stringToBuffer
返回myBuffer
,因此您尝试在该缓冲区上调用名为finallyDecrypt
的方法(该方法没有该方法,因此出错)。
如果您希望它与链接一起使用,请使用类似于您处理currentValue
的方式:
stringToBuffer : function() {
...
this.myBuffer = myBuffer;
return this;
},
finallyDecrypt : function() {
if (this.myBuffer) {
...
}
}
答案 1 :(得分:0)
stringToBuffer()函数返回一个Buffer(如果this.currentValue为false,它可能不会返回任何内容)。你尝试调用的函数不在Buffer中,它在decryptionChain中,所以当你尝试在Buffer上调用一个不存在的函数时,它会告诉你它的未定义
注意在decodeBase64()中,存储this.currentValue然后返回它。这就是下一个链工作的原因,因为正在返回decryptionChain对象。
所以stringToBuffer()可以将它的结果存储在this.bufferedResult中,然后stringToBuffer()可以返回它。