如何让Express API返回结构化的用户详情响应?
解决Express API返回自定义用户结构的问题
方法一:查询后手动转换数据结构
直接对查询到的用户数组做映射,将MongoDB返回的字段转换成目标格式,同时过滤掉多余的__v字段:
router.get("/users", async (req, res) => { const users = await User.find(); // 转换每个用户的结构 const formattedUsers = users.map(user => ({ userId: user._id.toString(), // 将ObjectId转为字符串格式的GUID firstName: user.firstName, lastName: user.lastName, accountId: user.accountId })); res.send(formattedUsers); });
方法二:使用Mongoose聚合查询直接返回目标结构
通过Mongoose的聚合管道,在查询阶段就完成字段重命名和过滤,减少后续处理:
router.get("/users", async (req, res) => { const formattedUsers = await User.aggregate([ { $project: { userId: "$_id", // 重命名_id为userId firstName: 1, lastName: 1, accountId: 1, _id: 0, // 排除原_id字段 __v: 0 // 排除__v字段 } } ]); res.send(formattedUsers); });
注:聚合返回的
userId已经是字符串格式,无需额外转换。
方法三:在Mongoose Schema中全局配置转换规则
如果所有接口都需要统一的用户结构,可以在User Schema中配置toJSON选项,让Mongoose自动转换返回格式:
const userSchema = new mongoose.Schema({ firstName: String, lastName: String, accountId: String }, { toJSON: { transform: function(doc, ret) { ret.userId = ret._id.toString(); delete ret._id; delete ret.__v; } } }); const User = mongoose.model('User', userSchema);
之后原接口代码无需修改,res.send(users)会自动返回目标格式:
router.get("/users", async (req, res) => { const users = await User.find(); res.send(users); });
内容的提问来源于stack exchange,提问作者Ayorinde Ajibaye
相关产品推荐
相关产品推荐

