当我使用sequelize进行查询时,例如这个
let User = require('../models').User;
...
User.findOne({ where:{ email : email }}).then( user => {
console.log(user);
})
返回的用户对象看起来很奇怪,并且有一些负面的副作用 . 它看起来像这样(链接因为太长):
所以我不能像许多例子那样做user.email或user.instanceMethod之类的事情 . 更糟糕的是,当我尝试调用实例方法时, this
引用了函数,而不是模型 .
我究竟做错了什么?
编辑:这是我的用户模型的外观
'use strict';
let Sequelize = require('sequelize');
let bcrypt = require('bcrypt');
module.exports = (sequelize, DataTypes) => {
let User = sequelize.define('User', {
email: {
type: Sequelize.STRING(100), allowNull: true, unique: true,
validate: {
isEmail: {
msg: 'No es una dirección de correo electrónico.'
},
}
},
google_id: {type: Sequelize.STRING(100)},
facebook_id: {type: Sequelize.STRING(100)},
password_digest: {
type: Sequelize.STRING,
},
password: {
type: Sequelize.VIRTUAL,
allowNull: true,
validate: {
len: [6, Infinity]
}
},
password_confirmation: {
type: Sequelize.VIRTUAL
},
token_reset: {type: Sequelize.STRING(100)},
token_confirm: {type: Sequelize.STRING(100)},
browser_key: {type: Sequelize.STRING(100)},
registry_ip: {type: Sequelize.STRING(60)},
registry_date: {type: Sequelize.DATE, defaultValue: Sequelize.NOW},
account_confirmed: {type: Sequelize.BOOLEAN, defaultValue: false},
terms_accepted: {type: Sequelize.BOOLEAN, allowNull: false},
account_active: {type: Sequelize.BOOLEAN, defaultValue: true},
current_ip: {type: Sequelize.STRING(60)},
login_date: {type: Sequelize.DATE, defaultValue: Sequelize.NOW}
}, {
freezeTableName: true,
indexes: [{unique: true, fields: ['email']}],
instanceMethods: {
authenticate: function (value) {
console.log("THIS",this);
console.log("comparing passwords",value, this.password_digest);
if (bcrypt.compareSync(value, this.password_digest))
return this;
else
return false;
}
}
});`
1 回答
在sequelize承诺中,您将从dataValues获取属性 . 因此,如果你想访问相同的可用承诺使用
User.dataValues.email
并且肯定会指向sequelize对象,你需要返回值并在其他函数中使用,如果你不想使用该承诺 . 另一种方法是使用raw:true