我尝试为我正在制作的应用程序更新模型。它是一个用户模型,它曾经有一个MAC地址对于每个用户都是唯一的。我删除了MAC并添加了UUID。现在,当我尝试创建一个用户(任何一个用户已经存在),我总是得到这个错误:
{
"macAddress": "The macAddress "null" is already taken."
}
这个错误是由一个基于猫鼬错误的util函数格式化的。这意味着mongoose认为我还有macAddress属性。早些时候我也得到了这个错误,但我仍然有一个MAC,我只是忽略了它。现在我不能忽略它,因为如果我尝试保存用户,它只是说.save()函数不存在。我在问如何在猫鼬中更新我的模型以适应新的模式-使用UUID而不是MAC。我擦除了所有的DB数据,它不起作用。这是我的用户模型:
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 };
}
}
我在我的系统中尝试了这个代码,它工作正常,正如你在你的查询中提到的,你需要从包含MAC地址的数据库中删除旧数据,因为,在你以前的模式中,你提到MAC地址是必需的和唯一的,所以你需要从唯一索引中删除它。
当我们保持一个密钥唯一,并用另一个密钥替换它时,就会发生这个问题。