update setters sequelize query postgres index freezetablename example define create sequelize.js password-storage

sequelize.js - setters - Secuela: no devolver la contraseña



sequelize update (5)

Me gusta usar una combinación de ambas respuestas de Pawan y declarar lo siguiente:

defaultScope: { attributes: { exclude: [''password''] }, }, scopes: { withPassword: { attributes: { }, } }

Esto me permite excluir la contraseña de forma predeterminada y usar el ámbito withPassword para devolver explícitamente la contraseña cuando sea necesario, como cuando se ejecuta un método de inicio de sesión.

userModel.scope(''withPassword'').findAll()

Esto garantiza que la contraseña no se devuelve cuando se incluye al usuario a través de un campo referenciado, por ejemplo,

accountModel.findAll({ include: [{ model: userModel, as: ''user'' }] })

Estoy utilizando Sequelize para realizar una búsqueda de base de datos para un registro de usuario, y quiero que el comportamiento predeterminado del modelo no devuelva el campo de password para ese registro. El campo de password es un hash pero aún no quiero devolverlo.

Tengo varias opciones que funcionarán, pero ninguna parece particularmente buena:

  1. Cree un método de clase personalizado findWithoutPassword para el modelo de User y dentro de ese método haga un User.find con los attributes establecidos como se muestra en los documentos de Sequelize

  2. Haga un User.find normal y filtre los resultados en el controlador (no se prefiere)

  3. Usa alguna otra biblioteca para quitar los atributos no deseados

¿Hay alguna manera mejor? Lo mejor de todo sería si hubiera una manera de especificar en la definición del modelo de Sequelize para no devolver nunca el campo de la password , pero no he encontrado una manera de hacerlo.


Otra forma es agregar un alcance predeterminado al modelo de usuario.

Añade esto en el objeto de opciones del modelo.

defaultScope: { attributes: { exclude: [''password''] }, }

O puede crear un ámbito separado para usarlo solo en ciertas consultas.

Añade esto en el objeto de opciones del modelo.

scopes: { withoutPassword: { attributes: { exclude: [''password''] }, } }

Entonces puedes usarlo en consultas.

User.scope(''withoutPassword'').findAll();


Tal vez solo pueda agregar exclude en su atributo cuando lo find , vea esto:

var User = sequelize.define(''user'', attributes); User.findAll({ attributes: { exclude: [''password''] } });

Lea la docs para más detalles


Yo sugeriría anular la función toJSON :

sequelize.define(''user'', attributes, { instanceMethods: { toJSON: function () { var values = Object.assign({}, this.get()); delete values.password; return values; } } });

O en secuela v4

const User = sequelize.define(''user'', attributes, {}); User.prototype.toJSON = function () { var values = Object.assign({}, this.get()); delete values.password; return values; }

toJSON se llama cuando los datos se devuelven al usuario, por lo que los usuarios finales no verán el campo de contraseña, pero aún estará disponible en su código.

Object.assign clona el objeto devuelto: de lo contrario, eliminará completamente la propiedad de la instancia.


hay un plugin para atributos de alcance como se discute here .

Fui con la anulación como se menciona en la respuesta aceptada, excepto que llamé el toJSON original en lugar de get con this.constructor.super_.prototype.toJSON.apply(this, arguments) como se describe en la api docs