You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:45:42