如何从序列化接收的对象中删除属性?

时间:2019-02-20 07:26:45

标签: node.js sequelize.js

我有一个需要在查询的where子句中输入日期的模型。

const Model = sequelizeTwo.define('model', {
    A: Sequelize.BIGINT,
    B: Sequelize.DOUBLE,
    C: Sequelize.DOUBLE,
    D: Sequelize.DOUBLE,
    E: Sequelize.DOUBLE, 
    F: Sequelize.DOUBLE,
    DATE: Sequelize.DATEONLY,  
    newCol: Sequelize.VIRTUAL

},{
    tableName: "Model",
    timestamps: false,
    freezeTableName: true
})
此处的

DATE用作查询的参数,以在客户端上显示信息。但这就是使用的目的。我不想将DATE发送回客户端,但看不到将其删除的方法。

如果我将其从模型中删除,则会出现时区错误,这也是另一个问题。

app.get('/api/:date', (req, res) => {
    var date = req.params.date

    Model.findAll({
        where: {
            DATE: {
                [Op.eq]: date
            }
        },
        order: [
            ['A', 'ASC']
        ]
    }).then(result => {

        ...

        for (i; i < result.length; i++) {

            ...
            delete result[i].DATE 
            console.log(result[i].DATE)
            result[i]["newCol"] = values;
        }
        res.json(result);
    })
})

我尝试在循环内外使用delete运算符,但这没有用。它仍然保留该属性并将其发送回客户端

            delete result[i].DATE //Inside loop
            delete result.DATE //before loop

赋值完成后它们会更新,但属性/键无法修改。

           result[i].DATE = null or undefined

我在这里想要实现的是,我只想发送一个对象,该对象具有续集模型除了 DATE

中的所有属性

2 个答案:

答案 0 :(得分:1)

在这种情况下,我认为您应该使用excludes功能:

Model.findAll({
    where: {
        DATE: {
            [Op.eq]: date
        }
    },
    order: [
        ['A', 'ASC']
    ],
    attributes: { exclude: ['DATE'] }
})

此处有更多信息:sequelize documentation

答案 1 :(得分:0)

我认为,最佳实践是为视图创建另一个模型作为数据传输对象(DTO),并仅将所需的属性映射到该模型(不使用Date)。

进一步阅读:DTO

伪代码示例:

Model.findAll({
    //...
}).then(result => {

    ...
    let resultDTO = mapToDTO(result);

    res.json(resultDTO);
})