【问题标题】:Sequelize JS - protecting propertiesSequelize JS - 保护属性
【发布时间】:2014-03-25 08:20:05
【问题描述】:
var Game = sequelize.define('Game', {

    secretField: {
        type: DataTypes.STRING(45),
        validate: {
            notEmpty: true
        }
    }
}, { 
    getterMethods: {
        secretFieldHash: function () {
            return crypto.createHash('sha256').update(this.getDataValue('secretField')).digest('hex');
        }
    }
});

上面的模型是我当前模型的一个例子。我想要达到的目标如下。

我有一个“secretField”,有时我需要在后端代码中使用它,但有时我也想在前端显示该字段的散列版本。

这可能吗?

我的问题的另一个例子是播放器模型。您不想将密码发送到前端,但有时您需要在后端使用它(即,如果用户输入了正确的密码进行比较)。

【问题讨论】:

    标签: javascript node.js sequelize.js


    【解决方案1】:

    您可能期待以下(尚未实现):https://github.com/sequelize/sequelize/issues/1462

    现在,您可以像这样覆盖 toJSON 方法:

    {
      instanceMethods: {
        toJSON: function () {
          var resp = this.prototype.toJSON();
          resp.secretField = hash(resp.secretField);
    
          return resp;
        }
      }
    }
    

    通过这种方式,您的后端可以使用秘密字段,但当对象转换为 JSON 并发送给最终用户时,该字段将被删除。

    【讨论】:

    • 确实有效。非常感谢。您是否也恰好知道 toJSON() 何时被调用?我不会在任何地方手动调用它。
    • 当您向客户端发送数据时,必须将其转换为 JSON。假设您使用的是 express。当您调用 res.json(200, response) 时,代码中的某处 express 调用 JSON.stringify(response),它检查 response 是否具有 toJSON 方法,以及是否调用该方法。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • 再次感谢!我现在明白了。以后可以显示原始的secretField值吗?我的游戏的工作方式我需要在游戏开始前显示哈希值,并在游戏结束时显示原始值。
    • @cspiegl 最近好像 Sequelize API 发生了变化,打破了这个解决方案
    • @JanAagaardMeier 用this.get({plain:true}) 代替this.prototype.toJSON() 怎么样?
    猜你喜欢
    • 2011-03-11
    • 2022-01-10
    • 2020-03-31
    • 2011-06-06
    • 1970-01-01
    • 2012-11-06
    • 2016-01-21
    • 2020-02-01
    • 2014-11-03
    相关资源
    最近更新 更多