2017-08-10 11 views
0

は、私は、データがユーザーに返さたいいくつかのsensetiveデータが含まれていないので、私はという名前の関数を使用してを選ぶこと toPublicJSONという名前instanceMethodsを追加していますtoPublicJSONは、この私のデータベースconfiguratsequelizeのinstanceMethods

関数ではないこと:underscoreJSが、私はこの機能(toPublicJSON)を使用する場合、私は、エラーが発生したからイオン:

var bcrypt = require("bcrypt"); 
var _ = require("underscore"); 

module.exports = function(sequelize, DataType) { 
    return sequelize.define('users', { 
     email: { 
      type: DataType.STRING, 
      allowNull: false, 
      unique: true, 
      validate: { 
       isEmail: true 

      } 
     }, 
     salt: { 
      type: DataType.STRING 
     }, 
     hassedPassword: { 
      type: DataType.STRING 
     }, 
     password: { 
      type: DataType.VIRTUAL, 
      allowNull: false, 
      validate: { 
       len: [7, 100] 
      }, 
      set: function(value) { 
       var salt = bcrypt.genSaltSync(10); 
       var hashed_password = bcrypt.hashSync(value, salt); 
       this.setDataValue('password', value); 
       this.setDataValue("salt", salt); 
       this.setDataValue("hassedPassword", hashed_password); 

      } 
     } 
    }, { 
     hooks: { 
      beforeValidate: function(user, option) { 
       if (typeof user.email == 'string') 
        user.email = user.email.toLowerCase(); 
      } 
     }, 

     instanceMethods:{ 
      toPublicJSON: function() { 
       var json = this.toJSON(); 
       return _.pick(json, 'id', 'email', 'createdAt', 'updatedAt'); 

      } 
     } 
    }); 
} 

私のコード:

app.post('/users',function(req,res){ 
    var body=_.pick(req.body,"email","password"); 
    db.users.create(body).then(function(user){ 
     return res.send(user.toPublicJSON()); 
    },function(e){ 
     return res.status(400).json(e); 
    }) 

}); 

と、これは誤りである:あなたがSequelizeの最新バージョンを使用していると仮定すると、

enter image description here

答えて

3

は、彼らがインスタンスを定義する方法を若干変更クラスメソッド。 sequelize.define('users');の結果のプロトタイプに関数を割り当てる必要があります。あなたはバージョン3にしている場合は、私に知らせて

const User = sequelize.define('users', {}); 
User.prototype.toPublicJSON = function() { 
    // Your code here 
}; 
return User; 

...以下に似た変数に sequelize.defineの結果を保存する必要があります。

幸運:)

EDIT:さらに読み物http://docs.sequelizejs.com/manual/tutorial/models-definition.html#expansion-of-models

EDIT 2:あなたはスコープに見てみたいことがあります。基本的にプリベークされたフィルタで、データを照会するときにデータに適用することができます。 http://docs.sequelizejs.com/manual/tutorial/scopes.html

あなたは、私はそれがあなたのために働くべきで行ったように、あなたのSequelizeテーブルのプロトタイプ関数として `toPublicJSON`を定義するなら、あなたは

sequelize.define('users', { 
    // Attributes... 
}, { 
    scopes: { 
    public: { 
     attributes: ['id', 'email', 'createdAt', 'updatedAt'] 
    } 
    } 
}); 

db.users.scope('public').findOne({...}); 
+0

を言うことができることをしなかった場合。そうするためにモデルを定義する方法を微調整するだけで済みます。 –

+0

ありがとうございました:) – Zola

+0

ありがとうございました – Zola