mongodb Mongoose在更改后不更新模型

qvtsj1bj  于 2023-04-11  发布在  Go
关注(0)|答案(1)|浏览(158)

我尝试为我正在制作的应用程序更新模型。这是一个用户模型,它曾经有一个MAC地址,每个用户都是唯一的。我删除了MAC,而是添加了一个UUID。现在,当我尝试创建一个用户(任何一个用户已经存在)时,我总是得到这个错误:

{
    "macAddress": "The macAddress \"null\" is already taken."
}

这个错误是由我基于mongoose错误创建的util函数格式化的。所以这意味着mongoose认为我仍然有一个macAddress属性。早些时候我也得到这个错误,但我当时仍然有一个MAC,我只是忽略了它。现在我不能忽略它,因为如果我试图保存用户,它只是说a .save()函数不存在。我问如何更新mongoose中的模型以适应新的Schema -使用UUID而不是MAC。我擦除了所有的DB数据,但它不起作用。下面是我的User模型:

const { Schema, model, models } = require("mongoose");

const userSchema = new Schema(
    {
        uuid: {
            type: String,
            required: [true, "UUID is required."],
            match: [
                // 12 characters long, 4 groups of 3 characters separated by hyphens
                /^[0-9a-f]{3}-[0-9a-f]{3}-[0-9a-f]{3}-[0-9a-f]{3}$/i,
                '"{VALUE}" is not a valid UUID.',
            ],
        },
        username: {
            type: String,
            required: [true, "Username is required."],
            unique: [true, 'The username "{VALUE}" is already taken.'],
            trim: true,
        },
        email: {
            type: String,
            required: [true, "Email is required"],
            unique: [true, 'The email "{VALUE}" is already taken.'],
            match: [
                /^[A-Za-z0-9_\.]+@[A-Za-z]+\.[A-Za-z]{2,3}$/,
                '"{VALUE}" is not a valid email.',
            ],
        },
        password: {
            type: String,
            required: [true, "Password is required."],
        },
        _tags: {
            type: [
                {
                    type: Schema.Types.ObjectId,
                    ref: "Tag",
                },
            ],
            default: [],
        },
        _token: {
            type: String,
        },
    },
    { timestamps: true, versionKey: false }
);

// before it was `const userModel = models["User"] || model("User", userSchema);`
const userModel = model("User", userSchema);

module.exports = userModel;

这是我的注册路线:

router.post("/register", async (req, res) => {
    try {
        const { uuid, username, email, password } = req.body;

        if (!(uuid && username && email && password)) {
            return res
                .status(400)
                .json({ message: "Please fullfil all fields." });
        }

        // Make Sure The UUID Is Unique
        let userWithSameUUID = (await getUsers({ uuid })).users[0];

        if (userWithSameUUID)
            return res.status(409).json({
                message: "This UUID is already registered.",
            });

        let encryptedPassword = await bcrypt.hash(password, 10);

        let user = await createUser({
            uuid,
            username,
            email: email.toLowerCase(),
            password: encryptedPassword,
        });

        // Check For Validation Errors
        if (user.err) {
            let { err } = user;
            let duplicateErrCodes = [11000, 11001];

            if (duplicateErrCodes.includes(err.code)) {
                return res.status(409).json(formatDuplicateError(err));
            }

            return res.status(400).json(formatValidationError(err));
        }

        user._token = jwt.sign(
            {
                _id: user._id,
                username: user.username,
                uuid: user.uuid,
            },
            process.env.TOKEN_KEY
        );

        await user.save();

        res.status(201).json({
            user: { ...user.toJSON(), password: undefined },
        });
    } catch (err) {
        res.status(500).json({ message: err.message });
    }
});

createUser函数:

async function createUser(user) {
    try {
        const newUser = await new User(user).save();

        return newUser;
    } catch (err) {
        return { err };
    }
}
lstz6jyr

lstz6jyr1#

我在我的系统中尝试了这段代码,它工作正常,正如你在查询中提到的,你需要从包含MAC地址的数据库中删除旧数据,因为,在你以前的模式中,你提到MAC地址是必需的和唯一的,所以你需要从唯一的索引中删除它。
当我们保持任何密钥唯一并将其替换为另一个密钥时,就会发生此问题。

相关问题