有没有一种方法可以自动编码where子句中的属性,使其匹配模型设置器(序列化)?

时间:2019-04-29 15:48:18

标签: node.js sequelize.js

我有一个API,可以检索属于用户的所有注释。我只想在我的API中返回加密的ID。我有一个对评论ID进行编码的getter。这是我的模特:

const Comment = sequelize.define('comment', {
    id: {
        type: DataTypes.BIGINT,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true,
        field: 'id',
        get:encodeId, //function which encrypts id 
        set:decodeId //function which decrypts id
    },
    userId: {
        type: DataTypes.BIGINT,
        allowNull: false,
        field: 'user_id'
    })  

这样做

Comment.findAll({where: {userId}}) ,

该ID正在加密,非常好。 我的问题是,如果我想查找给定了加密评论ID的评论的所有者。 例如,给定ID 123456,其加密为“ P11Y9052Oam”。做的时候

Comment.findAll({where: { id:"P1lY9052Oam"}})

我收到以下错误: SequelizeDatabaseError:整数输入无效的语法:“ P1lY9052Oam” 。 我想知道是否有一种方法可以通过续集来转换where属性。在这里,我希望id由id设置器的encodeId函数转换。

1 个答案:

答案 0 :(得分:0)

您可以在Comment模型上声明一个静态函数

例如:

const Comment = sequelize.define('comment', {
    id: {
        type: DataTypes.BIGINT,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true,
        field: 'id',
        get:encodeId, //function which encrypts id 
        set:decodeId //function which decrypts id
    },
    userId: {
        type: DataTypes.BIGINT,
        allowNull: false,
        field: 'user_id'
    })  

Comment.commentsByUserEncodeedId = function(id){
   // "decodeId" is your decode function
    return Comment.findAll({where: { id: decodeId(id) }});
}

// calling the function
Comment.commentsByUserEncodeedId("P1lY9052Oam")
        .then(function(results){
            console.log(results)
         });