Node.js中Mongoose模型tokens.token属性赋值失败,如何解决?
问题解决:Mongoose Schema定义错误导致token赋值失败
你的问题根源出在Mongoose Schema的定义错误,以及后续的赋值方式不对。
你当前把tokens定义成了单一对象,但实际场景中(比如支持多设备登录)我们通常需要存储多个token,所以应该将tokens定义为数组类型的子文档。当前的Schema写法导致Mongoose初始化后user.tokens被处理成了空数组,因此你直接赋值user.tokens.token完全不会生效。
正确的Schema定义
将tokens改为数组类型,每个元素是包含token字段的对象:
const UserSchema = new mongoose.Schema({ name: { type: String, required: true, trim: true }, // 其他字段省略... tokens: [{ // 这里改为数组 token: { type: String, required: true } }] });
正确的赋值方式
生成JWT后,需要往tokens数组中添加一个包含token的对象:
// 生成token const token = jwt.sign({_id : user._id.toString()}, process.env.JWT_TOKEN_SECRET,{ expiresIn: process.env.JWT_TOKEN_EXPIRES_IN }) // 往tokens数组中新增token对象 user.tokens.push({ token }); console.log(user.tokens); // 此时会输出包含该token的数组
特殊情况:仅需存储单个token
如果你的业务场景只需要存储一个token(不推荐,会导致多设备登录时token被覆盖),可以直接定义单个token字段,无需嵌套:
const UserSchema = new mongoose.Schema({ name: { type: String, required: true, trim: true }, // 其他字段省略... token: { type: String, required: true } });
赋值时直接操作:
user.token = token;
注意:修改Schema后需要重启服务,确保Mongoose加载新的Schema定义。如果是已存在的数据库集合,可能需要手动同步集合结构或使用Mongoose迁移工具。
内容的提问来源于stack exchange,提问作者Apostolos Lazidis
相关产品推荐
相关产品推荐

