MongoDB、Mongoose与TypeScript中用户文档属性无法访问问题
问题原因
Mongoose的findById()方法默认返回的是Query对象,不是直接的用户文档实例。这个Query是用来构建、执行数据库查询的工具对象,本身不包含你定义的email、_id这类文档属性,所以TypeScript会提示属性不存在的错误。
解决方案
要拿到实际的用户文档,必须先执行这个Query,常用两种方式:
方式1:用async/await(推荐)
数据库查询是异步操作,用async/await能直观获取结果:
// 确保所在函数是async函数 const getTargetUser = async () => { const user = await User.findById(payload.sub); if (user) { const { email, _id } = user; // 这里可以正常访问属性 } };
方式2:调用exec()方法
通过Query对象的exec()方法执行查询,返回Promise:
User.findById(payload.sub).exec() .then(user => { if (user) { const { email, _id } = user; // 处理业务逻辑 } }) .catch(err => { // 处理查询错误 });
额外提示
- 一定要处理
user为null的情况:当找不到对应ID的用户时,findById()会返回null,解构前做非空判断能避免运行时报错。 - 如果你用的是Mongoose 6+版本,
IUser不需要继承mongoose.Document,直接定义属性就行,Mongoose会自动处理_id这类内置文档属性:
export interface IUser { email: string; password: string; } const UserSchema = new mongoose.Schema({ email: { type: String, required: true, unique: true }, password: { type: String, required: true }, }); export default mongoose.model<IUser>('User', UserSchema);
内容的提问来源于stack exchange,提问作者user18923197
相关产品推荐
相关产品推荐

