2017-08-10 63 views
0

我想configurate我的数据库,我想将数据返回给用户不包括一些sensetive数据,所以我添加instanceMethods命名toPublicJSON,使用一个命名函数underscoreJS,但是当我使用这个功能(toPublicJSON)我遇到一个错误:即toPublicJSON不是功能sequelize instanceMethods

这是我的数据库configurat离子:

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); 
    }) 

}); 

,这是错误:

enter image description here

回答

3

假设你使用的是最新版本的Sequelize他们稍微改怎么定义实例和类方法。您需要将函数分配给sequelize.define('users');的结果原型。您需要的sequelize.define结果保存到一个变量,类似下面...

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

如果你在3个版本让我知道。

祝你好运:)

编辑:进一步阅读材料http://docs.sequelizejs.com/manual/tutorial/models-definition.html#expansion-of-models

编辑2:您可能想看看范围。它们基本上是预先烘焙的过滤器,可以在查询数据时应用于数据。 http://docs.sequelizejs.com/manual/tutorial/scopes.html

如果你这样做,那么你可以说

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

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

如果定义了'toPublicJSON'为您Sequelize表的原型函数像我这样做是应该为你工作。你只需稍微调整一下你如何定义模型就可以了。 –

+0

非常感谢:) – Zola

+0

现在工作谢谢 – Zola