续集实例方法
sequelize instanceMethods
我正在尝试配置我的数据库,我希望返回给用户的数据不包含一些敏感数据,所以我添加了一个名为 instanceMethods 的 [=23] =]toPublicJSON 使用 pick 来自 underscoreJS 的函数,但是当我使用这个函数时(toPublicJSON ) 我遇到错误:toPublicJSON 不是 function
这是我的数据库配置:
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,它们稍微改变了如何定义实例和 class 方法。您需要将函数分配给 sequelize.define('users');
结果的原型。您需要将 sequelize.define
的结果保存到一个变量中,类似于下面...
const User = sequelize.define('users', {});
User.prototype.toPublicJSON = function() {
// Your code here
};
return User;
如果您使用的是版本 3,请告诉我。
祝你好运:)
编辑:进一步阅读 material 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({...});
我正在尝试配置我的数据库,我希望返回给用户的数据不包含一些敏感数据,所以我添加了一个名为 instanceMethods 的 [=23] =]toPublicJSON 使用 pick 来自 underscoreJS 的函数,但是当我使用这个函数时(toPublicJSON ) 我遇到错误:toPublicJSON 不是 function
这是我的数据库配置:
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,它们稍微改变了如何定义实例和 class 方法。您需要将函数分配给 sequelize.define('users');
结果的原型。您需要将 sequelize.define
的结果保存到一个变量中,类似于下面...
const User = sequelize.define('users', {});
User.prototype.toPublicJSON = function() {
// Your code here
};
return User;
如果您使用的是版本 3,请告诉我。
祝你好运:)
编辑:进一步阅读 material 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({...});