Node.js 我一直在尝试用Mongoose解决nodeJS中的重复密钥问题,但没有任何效果

Node.js 我一直在尝试用Mongoose解决nodeJS中的重复密钥问题,但没有任何效果,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在尝试建立一个用户模型,但我想确保用户名和电子邮件是唯一的。当我创建第一个用户时,一切都正常,但是当我尝试创建具有相同信息的第二个用户时,我得到了一些错误,我可以在保存时处理这些错误,但是没有复制密钥来处理它 这是我的架构文件代码: const UserSchema = new Schema({ // this username with SchemaType of string username: { type: String, lowerc

我正在尝试建立一个用户模型,但我想确保用户名和电子邮件是唯一的。当我创建第一个用户时,一切都正常,但是当我尝试创建具有相同信息的第二个用户时,我得到了一些错误,我可以在保存时处理这些错误,但是没有复制密钥来处理它

  • 这是我的架构文件代码:

    const UserSchema = new Schema({
        // this username with SchemaType of string
        username: {
            type: String,
            lowercase: true,
            required: [true, "username is required"],
            unique: true,
            trim: true,
            minlength: [4, "try to user longer name"],
            maxlength: [60, "your name is way too long"],
        },
        // virtual name
        name: {
            // name have two properties
            // first is first and refer to first-name
            // second is last and refer to last-name
            first: {
                type: String,
                lowercase: true,
                trim: true,
                minlength: 4,
                maxlength: 20
            },
            last: {
                type: String,
                lowercase: true,
                trim: true,
                minlength: 4,
                maxlength: 20
            }
        },
        password: {
            type: String,
            required: [true, "password is required"]
        },
        email: {
            type: String,
            required: [true, "email is required"],
            unique: true
        },
        active: {
            type: Boolean,
            default: true
        },
        admin: {
            type: Boolean,
            default: false
        },
        meta: {
            update: {
                type: Date,
                default: Date.now()
            },
            timestamp: {
                type: Date,
                default: Date.now()
            }
        }
    });
    
    
    UserSchema.virtual("fullname").get(function () {
        // return the concatenation of first and last
        return this.name.first + " " + this.name.last;
    });
    
    // Create User Model
    const User = mongoose.model("User", UserSchema);
    
    module.exports = User;
    
  • 这是我试图处理的路由器代码:

    router.post("/register", (request, response) => {
        const user = {
            username: request.body.username,
            email: request.body.email,
            password: request.body.password
        };
    
        if (!user.email && !user.username && !user.password) {
            return response.json({
                "message": "please fill the whole information"
            });
        }
        // put user info in model
        const newUser = new User({
            username: user.username,
            email: user.email,
            password: user.password
        })
    
        newUser.validate((err) => {
            console.log(err);
        });
        // save User in model
        newUser.save()
        // return response with info
        return response.status(201).json(user);
    })
    

  • 我认为这里的解释很简单。您正在为多个字段指定模式中的
    unique
    属性,因此mongo将不允许您使用相同的信息创建多个条目。这是很明显的

    另外,我注意到你的代码有点不规则。您正在调用的save方法返回一个
    承诺
    ,这意味着事件循环不会阻止您的代码,并且会立即返回响应。为此,您需要在
    然后
    块中处理响应,或者在整个代码中使用
    异步等待

    我建议作出以下修改:

    router.post("/register", (request, response) => {
        const user = {
            username: request.body.username,
            email: request.body.email,
            password: request.body.password
        };
    
        if (!user.email && !user.username && !user.password) {
            return response.json({
                "message": "please fill the whole information"
            });
        }
        // put user info in model
        const newUser = new User({
            username: user.username,
            email: user.email,
            password: user.password
        })
    
        newUser.validate((err) => {
           if(err) {
             response.status(403).json({ message: 'Your custom error message' });
           }
    
           newUser.save().then(res => {
               return response.status(201).json(user);
           }).catch(e => {
               return response.status(500).json({ message: 'Your custom error message' });
           })
        });        
    })
    

    谢谢你的回答。这对我帮助很大,我错过了拯救的承诺,无论如何,谢谢你的努力