import mongoose from "mongoose";

const userSchema = new mongoose.Schema(
    {
        name: {
            type: String,
            required: [true, "Please provide your name."],
            minLength: [3, "Name must be at least 3 characters long"],
            maxLength: [50, "Name cannot exceed 50 characters"],
            trim: true,
            index: true,
        },
        username: {
            type: String,
            required: [true, "Please provide a username."],
            minLength: [3, "Username must be at least 3 characters long"],
            maxLength: [30, "Username cannot exceed 30 characters"],
            unique: [
                true,
                "This username is already taken. Please choose another one.",
            ],
            lowercase: true,
            trim: true,
            index: true,
        },
        email: {
            type: String,
            required: [true, "Please provide your email address."],
            unique: [
                true,
                "This email address is already registered. Please login or use a different one.",
            ],
            lowercase: true,
            trim: true,
        },
        password: {
            type: String,
            required: [true, "Please provide a password."],
            minLength: [8, "Password must be at least 8 characters long"],
            maxLength: [50, "Password cannot exceed 50 characters"],
        },      
    },
    { timestamps: true }
);

export const User = mongoose.model("User", userSchema);

我们可以这样使用Unique吗?

我见过Mongoose Docs,Required,MaxLength,minLength在那里使用过,但没有Unique.你能帮我这个忙吗?

这是正确的还是这样使用它是一种好的做法

推荐答案

不幸的是,Mongoose唯一约束不同于验证器,因此您不能将定制的错误消息传递给它们.

当您将属性定义为unique: true时,Mongoose使用MongoDB唯一索引,这样您就可以判断本地驱动程序在文档创建过程中抛出的E11000错误,并根据需要使用自定义消息进行响应.

大概是这样的:

app.post('/user',  async (req, res) => {
   try{
      const newUser = await User.create({
         name: req.body.name,
         username: req.body.username,
         email: req.body.email,
         password: req.body.password
      });
      return res.status(201).json({
         message: 'New User Created'
      })
   }catch(err){
      console.log(err);
      if(err.code === 11000){
         const errorMessages = new Map([
            ['username', 'This username is already taken. Please choose another one.'],
            ['email', 'This email address is already registered. Please login or use a different one.'],
         ]);
         return res.status(400).json({
            error: errorMessages.get(Object.keys(err.keyPattern)[0])
         })
      }else{
         return res.status(500).json({
            error: 'Error on Server'
         })
      }
   }
})

通过创建const errorMessages = new Map(),您可以将所有自定义重复键错误消息存储在Map对象中.然后,要访问正确的对象,您可以使用err.keyPattern,它将是key: value对的对象.通过在err.keyPattern上调用Object.keys,您可以 Select 索引为0的键,它将返回违反唯一索引的属性的名称.

Mongodb相关问答推荐

MongoDB:删除键上有条件的对象元素

MongoDB Aggregate-如何在条件中替换字符串中的变量

我无法将文档发送到我的MongoDB集合,因为它告诉我使文档无效

我们可以在Mongoose中这样使用Unique:[True,";This to Unique&qot;]吗

MongoDB MQL,将列表一分为二,仅获取唯一值

MongoDB对两个串联数组进行排序

所有文档中嵌套 struct 中的条件匹配-mongodb

MongoDB聚合$group阶段$top与$first在大型数据集上的效率

当日期和时间在不同键的字符串中时,Mongo 查询过滤今天的数据

MongoDB 投影按数组中的字符串长度排序

如何判断 MongoDB 的两个数组中是否存在值?

Golang:如何判断 collection.Find 是否没有找到任何文件?

解析命令行时出错:unrecognized option --rest

Meteor mongo 驱动程序可以处理 $each 和 $position 运算符吗?

Node.js 和 MongoDB,重用 DB 对象

mongodb中类型不相等的查询

MongoDB 范围查询中 $lt 和 $gt 的顺序

mongodb: UnknownError assertion src/mongo/db/server_options_helpers.cpp:355

MongoDB $elemMatch $in

brew install mongodb 错误:Cowardly refusing to `sudo brew install' Mac OSX Lion