2015-01-15 7 views
9

Ich benutze Sequelize, um einen DB-Fund für einen Benutzerdatensatz zu machen, und ich möchte das Standardverhalten des Modells nicht geben Sie das password Feld für diesen Datensatz zurück. Das Feld password ist ein Hash, aber ich möchte es immer noch nicht zurückgeben.Sequelize: Passwort nicht zurückgeben

Ich habe mehrere Optionen, die funktionieren werden, aber keiner scheint besonders gut:

  1. eine Methode benutzerdefinierte Klasse erstellen findWithoutPassword für das User Modell und innerhalb dieser Methode macht ein User.find mit dem attributes Satz wie in der gezeigt Sequelize docs

  2. Führen Sie eine normale User.find und filtern die Ergebnisse in der Steuereinheit (nicht bevorzugt)

  3. eine andere Bibliothek verwenden, um unerwünschte Eigenschaften

Gibt es eine bessere Art und Weise abzustreifen? Am besten wäre es, wenn es eine Möglichkeit gibt, in der Sequelize-Modelldefinition anzugeben, das Feld password nie zurückzugeben, aber ich habe keinen Weg gefunden, dies zu tun.

Antwort

38

würde ich zwingende schlagen die toJSON Funktion:

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

     delete values.password; 
     return values; 
    } 
    } 
}); 

Oder in sequelize v4

const User = sequelize.define('user', attributes, {}); 

User.prototype.toJSON = function() { 
    var values = Object.assign({}, this.get()); 

    delete values.password; 
    return values; 
} 

toJSON aufgerufen wird, wenn die Daten an den Benutzer zurückgegeben wird, so endet die Nutzer nicht das sehen Passwort-Feld, aber es wird immer noch in Ihrem Code verfügbar sein.

Object.assign klont das zurückgegebene Objekt - Andernfalls werden Sie die Eigenschaft vollständig aus der Instanz löschen.

+0

Das ist ein interessanter Ansatz. Würde dies verhindern, dass jemals das Passwort (oder andere Blacklist-Attribute) aus dem Modell entfernt werden? – tyler

+0

EDIT: das ist nicht das Passwort für mich herausfiltern. Sieht so aus, als ob die instanceMethod 'toJSON' nicht für die Rückgabe von' user.get() 'oder' user.dataValues' aufgerufen wird. Sollte ich eine andere Methode verwenden, um Attribute zurückzugeben? – tyler

+0

Sie sollten entweder 'toJSON' aufrufen oder einfach das Benutzerobjekt zurückgeben. Zum Beispiel 'res.send (200, user)' ruft intern 'JSON.stringify' auf dem Benutzerobjekt auf, welches seinerseits' toJSON' aufruft. –

0

gibt es ein Plugin für scoping attributes wie diskutiert here.

i mit der Überschreibung ging wie in der akzeptierte Antwort erwähnt, außer ich das Original toJSON statt get mit this.constructor.super_.prototype.toJSON.apply(this, arguments) im api docs

13

Vielleicht können Sie nur exclude an Ihrem Attribut hinzufügen, wenn Sie find, wie genannt aussehen dies wie:

var User = sequelize.define('user', attributes); 

User.findAll({ 
    attributes: { 
     exclude: ['password'] 
    } 
}); 

die docs um weitere Informationen lesen

+2

Hinzufügen des Blocks von 'Attribute' zu ​​jeder Abfrage ist nicht so gut. Es ist eine Möglichkeit zum Definieren von Ausschlussattributen auf Modellebene zum Anwenden aller Abfragen erforderlich. –

+0

@AliSherafat du hast Recht, danke für den Rat. – Lai32290

2

Anot Ihr Weg besteht darin, dem Benutzermodell einen Standardbereich hinzuzufügen.

Fügen Sie diese in den Optionen des Objektmodell

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

Oder Sie können einen separaten Bereich erstellen es in bestimmten Abfragen nur zu verwenden.

Fügen Sie diese in den Optionen des Objektmodell

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

Dann können Sie es in Abfragen verwenden

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