为什么这段代码中的 finallyDecrypt 方法未定义?

Why is the finallyDecrypt method in this code undefined?

我的应用收到一个 base64 编码值,该值也被加密。数据可以有几种不同的方式,所以我想创建可链接的方法来保持代码的整洁和模块化。

我希望能够写:decryptionChain.decodeBase64(b64Value).stringToBuffer().finallyDecrypt();

当我运行代码时,最后属性方法"finallyDecrypt"returns为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;

    }
};

链接的工作原理是从每个方法返回 this(指向 decryptionChain 对象)。

stringToBuffer,然而,returns myBuffer,所以你试图在那个缓冲区上调用一个名为 finallyDecrypt 的方法(它没有那个方法,因此出现错误)。

如果您希望它与链接一起使用,请使用类似于您处理 currentValue:

的方式
stringToBuffer : function() {
  ...
  this.myBuffer = myBuffer;
  return this;
},
finallyDecrypt : function() {
  if (this.myBuffer) {
    ...
  }
}

stringToBuffer() 函数 return 是一个缓冲区(或者如果 this.currentValue 为假,它可能 return 什么都没有)。您尝试调用的函数不在 Buffer 中,它在 decryptionChain 中,因此当您尝试调用 Buffer 上不存在的函数时,它会告诉您它未定义。

注意在 decodeBase64() 中,您存储 this.currentValue 然后 return 这个。这就是下一条链起作用的原因,因为解密链对象正在 returned.

所以 stringToBuffer() 可以将其结果存储在 this.bufferedResult 中,然后 stringToBuffer() 可以 return 这个。