如何使用Sequelize结合axios获取属性数据及其对应的数据类型?
Sequelize 查询时同步返回字段对应数据类型实现方案
以下是可直接落地的3种实现方案:
方案1:直接从模型定义中提取元数据(性能最优)
Sequelize 所有模型内置 rawAttributes 属性,存储了每个字段的完整定义,包含数据类型信息,不需要额外发起数据库查询。
示例代码:
// 假设你已经定义了User模型,要获取age字段的类型 const fieldType = User.rawAttributes.age.type.key; // 输出结果示例:INTEGER、STRING、DATE等标准数据类型标识 // 批量获取当前模型所有字段的类型映射 const fieldTypeMap = Object.fromEntries( Object.entries(User.rawAttributes).map(([fieldName, config]) => [fieldName, config.type.key]) );
方案2:查询数据时同步附带回字段类型
如果你需要前端通过 axios 请求接口时,同时拿到业务数据和对应字段类型,可以在查询逻辑后做一层数据拼接:
async function getUserWithType(userId) { // 第一步查询业务数据 const user = await User.findByPk(userId); const userData = user.toJSON(); // 第二步生成字段类型映射 const typeMap = Object.fromEntries( Object.entries(User.rawAttributes).map(([field, config]) => [field, config.type.key]) ); // 拼接返回结构 return { data: userData, fieldTypes: typeMap } }
前端请求该接口后,即可同时拿到字段值和对应的数据类型。
方案3:使用Sequelize钩子自动注入类型(全局复用)
如果需要所有该模型的查询接口都自动附带回字段类型,可以给模型加全局 afterFind 钩子:
User.addHook('afterFind', (result) => { const typeMap = Object.fromEntries( Object.entries(User.rawAttributes).map(([field, config]) => [field, config.type.key]) ); // 兼容单条查询、多条查询两种场景 if (Array.isArray(result)) { result.forEach(item => item.dataValues.fieldTypes = typeMap); } else if (result) { result.dataValues.fieldTypes = typeMap; } })
注意事项
- 如果使用自定义数据类型,
type.key可能无法直接识别,可以取type.toString()获取完整的类型定义字符串 - 钩子注入的类型默认会在
toJSON()后保留,如果你配置了序列化排除字段,需要把fieldTypes加入保留字段列表
内容的提问来源于stack exchange,提问作者akshit goel
相关产品推荐
相关产品推荐

