首页 > 解决方案 > Express - 如何从 Model.findOne() 和 Model.create() mongoose 返回的响应中排除字段

问题描述

我想在向我的前端发送响应时排除用户的密码字段。当然,我不希望任何人访问用户的加密密码。

我看过这个SO question,但该解决方案对于具有许多领域的模型看起来并不好。

我正在使用.select('-password')with Model.find(), Model.findById(), andModel.findByIdAndUpdate()

但它不适用于Model.findOne()Model.create()

返回响应时如何排除某些字段?

/**
 * @desc   Authenticate User
 * @route  /api/acccounts/signin
 * @access Public
 */
export const authenticateUser = asyncHandler(async (req, res) => {
  const values = await loginSchema.validateAsync(req.body);

  const { email, password, rememberMe } = values;

  const account = await Account.findOne({ email });

  if (account && (await account.matchPassword(password))) {
    return res.json({
      id: account.id,
      firstName: account.firstName,
      lastName: account.lastName,
      email: account.email,
      isAdmin: account.isAdmin,
      ...other fields,
      token: generateToken(account.id, rememberMe),
    });
  }

  return res.status(400).json({ message: 'Invalid email or password' });
});

标签: node.jsmongodbexpressmongoose

解决方案


在这里,您可以使用投影来排除响应中的字段,如下所示

db.collection.findOne({
  email: "sample@sample.com"
},
{
  password: 0
})

这里就像是游乐场来测试它:MongoPlayground

有关详细信息,请查看findOne官方文档


推荐阅读