3

私は mongoosejs ODM スキーマで定義されたカスタム メソッドを持っています。これにより、salt を生成し、指定されたパスワードをエンコードできます。

node.js 暗号化モジュールは非同期であるため、パスワード エンコーディングをソルト コールバックに入れる必要があります (そうしないと、生成に時間がかかるため、ソルトはまったくありません)。しかし、これは主な問題ではありません。主な問題は、mongoosejs オブジェクトのソルトとパスワードのプロパティを設定する必要があることです。通常、これは "this" で行いますが、"this" はコールバックでは機能しません (親オブジェクトではなくコールバックを参照します)。

では、非同期呼び出しからエンコードされたパスワードとソルトを取り戻すにはどうすればよいでしょうか?

methods: {
    setPassword: function(password) {
        crypto.randomBytes(32, function(err, buf) {
            var salt = buf.toString('hex');
            this.salt = salt;
            crypto.pbkdf2(password, salt, 25000, 512, function(err, encodedPassword) {
                if (err) throw err;
                this.password = encodedPassword;
            });
        });
    }
}

returnステートメントも使用してみましたが、何も返されません...

4

1 に答える 1

7

変数をthisコールバックの外側に設定して、内側で使用することができます。

methods: {
    setPassword: function(password) {
        crypto.randomBytes(32, function(err, buf) {
            var self = this;
            var salt = buf.toString('hex');
            this.salt = salt;
            crypto.pbkdf2(password, salt, 25000, 512, function(err, encodedPassword) {
                if (err) throw err;
                self.password = encodedPassword;
            });
        });
    }
}

thisまたは、値が保持されるようにコールバック関数をバインドできます。

methods: {
    setPassword: function(password) {
        crypto.randomBytes(32, function(err, buf) {
            var salt = buf.toString('hex');
            this.salt = salt;
            crypto.pbkdf2(password, salt, 25000, 512, function(err, encodedPassword) {
                if (err) throw err;
                this.password = encodedPassword;
            }.bind(this));
        });
    }
}
于 2012-07-19T06:34:35.773 に答える