使用 Sequelize Create 方法时如何仅返回特定属性

Jam*_*mes 7 javascript sequelize.js sequelize-cli

我一直在搜索 Sequelize 文档和论坛以寻找正确的语法,看来我的做法是正确的,但由于某种原因,密码字段仍在响应有效负载中返回...

以下链接显示了我在 Sequelize 3.11 版中添加的属性排除语法:https : //github.com/sequelize/sequelize/issues/4074

有谁知道我在这里可能会错过什么?下面是语句中的Create方法和控制台日志Insert

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)
};
Run Code Online (Sandbox Code Playgroud)

}

控制台日志

执行(默认):INSERT INTO "Users" ("id","firstName","lastName","email","password","createdAt","updatedAt") VALUES (DEFAULT,'James','Martineau' ,'test@gmail.com','$2b$10$7ANyHzs74OXYfXHuhalQ3ewaS4DDem1cHMprKaIa7gO434rlVLKp2','2019-02-28 15:18:15.856 +00:00','2019:05:2018 ) 返回 *;

用户:用户{ dataValues:{ id:6,名字:'James',姓氏:'Martineau',电子邮件:'test@gmail.com',密码:'$2b$10$7ANyHzs74OXYfXHuhalQ3ewaS4DDem1cHMprKaIa7gO434rlVLKp20',updated :18:15.856Z, createdAt: 2019-02-28T15:18:15.856Z }...

Joe*_*Joe 10

处理此问题的正确方法是利用 Sequelize 公开的实际数据模型上的 afterCreate 和 afterUpdate 挂钩。这些钩子在记录持久化后被触发,因此对 dataValues 的任何突变只会反映在返回中。

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;
            },
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

这是文档的链接:https://sequelize.org/master/manual/hooks.html


Chu*_*ran 4

我在文档中看到,创建模型时不能排除属性。仅当您找到型号时才排除。

我建议:

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);
    };
}
Run Code Online (Sandbox Code Playgroud)

  • 这是最终结果 `delete user.dataValues.password` 再次查询数据库以获取特定属性的成本会更高。 (2认同)