2

作業中のプロジェクトのスキーマにアタッチしたメソッドの呼び出しに関して混乱が生じています。基本的に、データベースからドキュメントにアクセスし、保存したハッシュ化されたパスワードと、ユーザーがログイン時に送信したパスワードを比較しようとしています。ただし、パスワードを比較しようとすると、スキーマのメソッド オブジェクトにアタッチしたメソッドがどこにも見つかりません。そのような方法がないことを教えてくれるエラーさえスローしません。これは、スキーマでメソッドを設定しているところです。

var Schema = mongoose.Schema;

var vendorSchema = new Schema({
  //Schema properties
});

vendorSchema.pre('save', utils.hashPassword);
vendorSchema.methods.verifyPassword = utils.verifyPassword;

module.exports = mongoose.model('Vendor', vendorSchema);

私が比較メソッドとして使用している関数は、ユーティリティ ファイルに保持されている、verifyPassword という名前のユーティリティ関数です。その関数のコードは次のとおりです。

verifyPassword: function (submittedPassword) {
    var savedPassword = this.password;

    return bcrypt.compareAsync(submittedPassword, savedPassword);
  }

次のようにパスワードを確認しようとします。

    var password = req.body.password;
    _findVendor(query)
        .then(function (vendor) {

          return vendor.verifyPassword(password);
        });

それが違いを生むなら、ブルーバードの約束でマングースを約束しました。私は多くのことを試しましたが、スキーマを添付したと思っていたこのメソッドを呼び出そうとしても、なぜ何も起こらないのかについての答えが見つかりません。どんな助けでも大歓迎です。

4

1 に答える 1

3
/*VendorSchema.js*/
var Schema = mongoose.Schema;
var vendorSchema = new Schema({
  //Schema properties
});
vendorSchema.methods.method1= function{
         //Some function definition
};
vendorSchema.statics.method2 = function{
         //Some function definition
};
module.exports = mongoose.model('Vendor', vendorSchema);

他のファイル内の VendorSchema にアクセスしたいとしましょう:

/*anotherfile.js*/
var VendorSchema= require('../VendorSchema.js');
var Vendor = new VendorSchema();

method2 を static として定義したので、schemareference オブジェクト VendorSchema を使用して anotherfile.js 内の method2 にアクセスできます。

VendorSchema.method2

ただし、me​​thod1 は静的ではありません。スキーマのオブジェクト インスタンスを作成した後でのみ、anotherfile.js 内の method1 にアクセスできます。

Vendor.method1 /*Vendor is object instance of the schema*/
于 2016-02-02T09:56:00.827 に答える