node.js - 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' });
});
解决方案
在这里,您可以使用投影来排除响应中的字段,如下所示
db.collection.findOne({
email: "sample@sample.com"
},
{
password: 0
})
这里就像是游乐场来测试它:MongoPlayground
有关详细信息,请查看findOne官方文档
推荐阅读
- c# - ConfigureAwait(false) 主要是为了后边界吗?
- c++ - 将 C++ 引用从 unsigned char 转换为 double& 安全吗?
- python - .env 无法识别土耳其语字符 (Mojibake)
- node.js - 应用程序连接到 MongoDB 数据库,但在命令行中使用“show dbs”提示时数据库不可见
- python - 如何建立蓝牙HFP服务级连接
- python - 如何在 Python 中以 2020-01-13T09:25:19-0330 格式获取当前日期时间?
- ios - 如何使用 GCD 中的串行或并发队列让快速操作一个接一个地同步?
- php - 如何在 laravel 中验证这种类型的条件?
- java - 使用 Spring MockMvc 测试时的回滚事务
- kubernetes - 为什么 kubernetes pod 显示 Back-off restarting failed 容器