【问题标题】:Why is the finallyDecrypt method in this code undefined?为什么此代码中的 finallyDecrypt 方法未定义?
【发布时间】:2015-08-07 20:22:24
【问题描述】:

我的应用收到一个同样经过加密的 base64 编码值。数据可以以几种不同的方式出现,所以我想创建可链接的方法来保持代码的干净和模块化。

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

当我运行代码时,最后一个属性方法“finallyDecrypt”返回为未定义。

为什么“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;

    }
};

【问题讨论】:

    标签: javascript method-chaining chain


    【解决方案1】:

    通过从每个方法返回 this(它指向 decryptionChain 对象)来实现链接。

    但是,stringToBuffer 返回 myBuffer,因此您尝试在该缓冲区上调用名为 finallyDecrypt 的方法(它没有该方法,因此出现错误)。

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

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

    【讨论】:

    • 知道了。感谢您的澄清。当我进行您建议的更改时,finallyDecrypt 不再未定义。但是,这样做的一个副作用似乎是将缓冲区分配给“this”会将缓冲区更改回导致解密失败的对象(因为它需要缓冲区)。在这种模式下,我将如何将缓冲区保留为缓冲区?
    • @Cyph 将缓冲区分配给变量不应转换任何内容(但 JSON.parse() 可能)
    【解决方案2】:

    stringToBuffer() 函数返回一个 Buffer(或者如果 this.currentValue 为 false,它可能什么也不返回)。您尝试调用的函数不在 Buffer 中,而是在 decryptionChain 中,因此当您尝试在 Buffer 上调用不存在的函数时,它会告诉您它是未定义的。

    注意在 decodeBase64() 中,你存储 this.currentValue 然后返回 this。这就是下一个链起作用的原因,因为正在返回decryptionChain 对象。

    所以 stringToBuffer() 可以将它的结果存储在 this.bufferedResult 中,然后 stringToBuffer() 可以返回 this。

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      相关资源
      最近更新 更多