类型'string'无法分配给参数类型'ObjectId'问题求助
解决方案
问题根源
你遇到的类型错误是因为TypeScript判定role._id为字符串类型,但你的User模型中roles数组定义的是ObjectId类型,二者类型不兼容。另外代码里存在一个明显笔误:await await User.findOne(...),多余的await会导致逻辑异常,需要移除。
修复步骤
- 移除冗余的await关键字
将:
let user = await await User.findOne({ username: body.username });
修改为:
let user = await User.findOne({ username: body.username });
- 将role._id转换为ObjectId类型
导入mongoose的类型工具,把字符串格式的role._id转换为符合要求的ObjectId类型:
首先在文件顶部添加mongoose导入:
import mongoose from "mongoose";
然后修改角色添加的代码:
user.roles.push(new mongoose.Types.ObjectId(role._id));
- 确保模型字段类型定义正确
检查你的User模型文件,确认roles字段的类型为ObjectId数组:
// ../db/models/user.js const userSchema = new mongoose.Schema({ // 其他字段... roles: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Role' }] }); export const User = mongoose.model('User', userSchema);
如果使用TypeScript接口定义,需保证接口中的roles类型与模型匹配:
interface User { // 其他字段... roles: mongoose.Types.ObjectId[]; }
完整修复后的代码
import { Router } from "express"; import mongoose from "mongoose"; import _ from "underscore"; import { User } from "../db/models/user.js"; import { Role } from "../db/models/role.js"; import { roleAddValidate } from "../middleware/roles/roleAdd.js"; const router = Router(); router.post("/add", roleAddValidate, async (req, res) => { const body = _.pick(req.body, "username", "role"); let user = await User.findOne({ username: body.username }); let role = await Role.findOne({ name: body.role }); // 新增:提前校验用户/角色是否存在,避免空值操作报错 if (!user) { return res.status(404).json({ message: "目标用户不存在" }); } if (!role) { return res.status(404).json({ message: "目标角色不存在" }); } try { user.roles.push(new mongoose.Types.ObjectId(role._id)); await user.save(); return res.json({ message: `Role ${body.role} added to ${body.username}`, id: user._id, }); } catch (e) { return res.status(500).json({ message: "Server DB Error", error: e }); } }); export { router as roleRouter };
内容的提问来源于stack exchange,提问作者Matan Almakaies
相关产品推荐
相关产品推荐

