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

时间:2015-08-07 20:22:25

标签: javascript method-chaining chain

我的应用会收到一个也加密的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;

    }
};

2 个答案:

答案 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()可以返回它。