如何在Sequelize创建用户后仅返回指定所需字段?
解决Sequelize create返回指定字段的问题
你遇到的问题本质是:Sequelize的create方法返回的是完整的Model实例,哪怕你通过returning指定了数据库只返回部分字段,Sequelize也会把你传入的创建参数(比如email、hash)自动填充到实例属性中,所以控制台打印和接口返回的是完整实例对象。
解决方法1:手动提取目标字段
直接从返回的实例中提取你需要的id和name,构造新对象返回:
try { const user = await User.create({ name, email, hash: passHashed }, { returning: ["id", "name"] }); // 仅保留需要的字段 const result = { id: user.id, name: user.name }; console.log(result); res.json(result); } catch (error) { console.log("error here", error); res.status(409).json(error); }
解决方法2:转为纯对象后筛选
如果需要处理更多字段,先把Model实例转为纯JavaScript对象,再筛选:
try { const user = await User.create({ name, email, hash: passHashed }, { returning: ["id", "name"] }); // 转为纯对象 const plainUser = user.get({ plain: true }); // 筛选目标字段 const result = { id: plainUser.id, name: plainUser.name }; console.log(result); res.json(result); } catch (error) { console.log("error here", error); res.status(409).json(error); }
补充说明
你看到SQL日志里确实只返回了id和name,这是returning参数生效的表现,但Sequelize在创建实例时,会将你传入的create参数(name、email、hash等)全部挂载到实例上,所以实例本身会包含所有属性。returning的作用只是让数据库返回指定字段,用于更新实例中对应属性的值(比如自动生成的id),但不会限制实例的其他属性存在。
内容的提问来源于stack exchange,提问作者Willian Almeida
相关产品推荐
相关产品推荐

