J'ai cherché dans la documentation et les forums Sequelize la syntaxe correcte et il semble que je le fasse de la bonne façon, mais pour une raison quelconque, le champ du mot de passe est toujours renvoyé dans la charge utile de la réponse ...

Le lien suivant montre que la syntaxe d'exclusion des attributs que j'utilise a été ajoutée dans la version 3.11 de Sequelize : https:// github.com/sequelize/sequelize/issues/4074

Quelqu'un sait ce que je pourrais manquer ici? Vous trouverez ci-dessous la méthode Create et le journal de console de l'instruction Insert.

méthode Create

async create(req, res) {
try {
    let user = await User.create({
        firstName: req.body.firstName,
        lastName: req.body.lastName,
        email: req.body.email,
        password: req.body.password
    }, {
        attributes: {
            exclude: ['password']
        }
    });

    console.log("USER: ", user);

    res.status(201).send(user.toJSON());
}
catch (error) {
    res.status(500).send(error)
};

}

Journal de la console

Exécution (par défaut): INSERT INTO "Users" ("id", "firstName", "lastName", "email", "password", "createdAt", "updatedAt") VALUES (DEFAULT, 'James', 'Martineau' , 'test @ gmail.com', '2 milliards $ 10 $ 7ANyHzs74OXYfXHuhalQ3ewaS4DDem1cHMprKaIa7gO434rlVLKp2', '2019-02-28 15: 18: 15.856 +00: 00', '2019-02-28 15: 18: 15.856 +00: 00' ) RETOUR *;

USER: User {dataValues: {id: 6, firstName: 'James', lastName: 'Martineau', email: 'test@gmail.com', mot de passe: '$ 2b $ 10 $ 7ANyHzs74OXYfXHuhalQ3ewaS4DDem1cHMprKaIa7gO434rlVLKp2' 2019-2T15 : 18: 15.856Z, créé le: 2019-02-28T15: 18: 15.856Z} ...

6
James 28 févr. 2019 à 18:36

5 réponses

Meilleure réponse

Je vois dans le document, vous ne pouvez pas exclure des attributs lorsque vous créez un modèle. Exclure uniquement lorsque vous trouvez un modèle.

Je suggère:

async create(req, res) 
{
try {
    let user = await User.create({
        firstName: req.body.firstName,
        lastName: req.body.lastName,
        email: req.body.email,
        password: req.body.password
    });
    delete user["password"];//delete field password
    console.log("USER: ", user);

    res.status(201).send(user.toJSON());
}
catch (error) {
    res.status(500).send(error)
};
}
2
Chuong Tran 1 mars 2019 à 03:10
 User.create(req.body).then(user => {
    delete user.dataValues.password
    res.json(user)
  }).catch(error => {
   // do something with error
  })
1
KBH 13 mars 2019 à 15:37

Essayez de surcharger la classe Sequelize Model avec la fonctionnalité souhaitée. Par exemple, exécutez le code suivant une fois pendant le démarrage de l'application:

import {Model} from 'sequelize';

const toJSON = Model.prototype.toJSON;

Model.prototype.toJSON = function ({attributes = []} = {}) {
    const obj = toJSON.call(this);

    if (!attributes.length) {
      return obj;
    }

    return attributes.reduce((result, attribute) => {
      result[attribute] = obj[attribute];

      return result;
    }, {});
  };

Après cela, vous pouvez utiliser votre code comme d'habitude, mais avec une option attributes:

User.toJSON({attributes: ['name', 'etc...']}).

2
Andrej Burcev 23 oct. 2019 à 22:55

Avec une lecture rapide des documents, il semble que attributes ne soit mentionné que dans des requêtes comme:

Model.findAll({
  attributes: { exclude: ['baz'] }
});

(http://docs.sequelizejs.com/manual/tutorial/querying.html #attributes)

Si vous souhaitez exclure password avec create, vous pouvez faire quelque chose comme:

let user = await User.create({
    firstName: req.body.firstName,
    lastName: req.body.lastName,
    email: req.body.email,
    password: req.body.password
}, {
    fields: ['firstName', 'lastName', 'email']
});

(http://docs.sequelizejs.com/manual/tutorial /instances.html#creating-persistent-instances)

2
Scott Rudiger 28 févr. 2019 à 15:56

La bonne façon de gérer cela consiste à tirer parti des hooks afterCreate et afterUpdate sur le modèle de données réel, que Sequelize expose. Ces hooks sont déclenchés après la persistance de l'enregistrement, de sorte que toute mutation des dataValues ​​ne sera reflétée que dans le retour.

sequelize.define(
    'User',
    {
        id: { type: DataType.UUID, defaultValue: Sequelize.UUIDV4, primaryKey: true },
        username: { type: DataType.STRING, allowNull: false },
        password: { type: DataType.STRING, allowNull: false }
    },
    {
        hooks: {
            afterCreate: (record) => {
                delete record.dataValues.password;
            },
            afterUpdate: (record) => {
                delete record.dataValues.password;
            },
        }
    }
);

Voici un lien vers la documentation : https://sequelize.org/master/manual/hooks. html

1
Joe 19 nov. 2020 à 15:20