Node.js如何修改响应体 重命名数据库返回的带前缀字段
解决方案
问题排查
你当前的转换逻辑思路是可行的,但存在两个需要修正的点:
- ORM框架(如Sequelize/Mongoose)调用
create方法返回的是模型实例对象,不是普通JS对象,直接用Object.entries遍历无法拿到数据库字段 - 现有响应中没有返回转换后的
newData,前端无法拿到处理后的字段 - 代码里存在笔误:
cg_is_active: req.body.is_ctive中is_ctive少了字母a,会导致字段赋值失败
方案1:修复现有代码
直接调整当前接口的处理逻辑,适配ORM返回结果:
const addCustomerGroup = async(req,res,next) => { try{ console.log(req.body) let data = await Group.create({ cg_name:req.body.name, cg_description:req.body.description, cg_is_active: req.body.is_active, cg_created_by: req.body.created_by, cg_modified_by: req.body.modified_by }) // 第一步:把模型实例转成普通JS对象 // Sequelize写法: const plainData = data.toJSON() // Mongoose写法: // const plainData = data.toObject() const newData = {}; const prefix = "cg_" for (const [key, value] of Object.entries(plainData)) { // 加前缀判断,避免误处理不带前缀的字段(如id、创建时间等) if(key.startsWith(prefix)){ newData[key.slice(prefix.length)] = value; }else{ newData[key] = value } } console.log(newData) res.send({ status:"success", message:"Added customer group", data: newData // 把处理后的数据返回给前端 }) } catch(error){ console.log(error) res.send({ status:"failed", message:"An error occurred" }) } }
方案2:封装通用转换工具(推荐多场景复用)
如果多个表都有类似的前缀处理需求,可以封装一个通用工具函数,全局复用:
// 通用字段前缀移除工具 const removeFieldPrefix = (obj, prefix) => { // 自动识别ORM实例转普通对象 const plainObj = obj.toJSON ? obj.toJSON() : (obj.toObject ? obj.toObject() : obj) return Object.fromEntries( Object.entries(plainObj).map(([key, value]) => [ key.startsWith(prefix) ? key.slice(prefix.length) : key, value ]) ) } // 接口中调用 const addCustomerGroup = async(req,res,next) => { try{ let data = await Group.create({ // 你的创建逻辑 }) const newData = removeFieldPrefix(data, 'cg_') // 其他表前缀比如ca_,直接传removeFieldPrefix(data, 'ca_')即可 res.send({ status:"success", message:"Added customer group", data: newData }) }catch(e){ // 错误处理逻辑 } }
方案3:ORM全局配置(一劳永逸)
如果你用的是Sequelize或者Mongoose,可以直接在模型定义时配置转换规则,后续所有查询、创建操作返回的结果自动处理前缀,不需要每个接口单独写转换逻辑:
Sequelize 配置示例
// Group模型定义时添加钩子 const Group = sequelize.define('Group', { cg_name: DataTypes.STRING, cg_description: DataTypes.STRING, // 其他字段定义 }, { hooks: { afterFind: (instance) => { if(instance) { const prefix = 'cg_' Object.keys(instance.dataValues).forEach(key => { if(key.startsWith(prefix)){ instance.dataValues[key.slice(prefix.length)] = instance.dataValues[key] delete instance.dataValues[key] } }) } } } })
Mongoose 配置示例
const groupSchema = new mongoose.Schema({ cg_name: String, cg_description: String, // 其他字段定义 }, { toJSON: { transform: (doc, ret) => { const prefix = 'cg_' Object.keys(ret).forEach(key => { if(key.startsWith(prefix)){ ret[key.slice(prefix.length)] = ret[key] delete ret[key] } }) } } }) const Group = mongoose.model('Group', groupSchema)
内容的提问来源于stack exchange,提问作者Nikeeta kurrey
相关产品推荐
相关产品推荐

