Использую MongoDB. Код для добавления данных в коллекцию:
type User struct {
Firstname string `json:"firstname" bson:"firstname"`
Lastname *string `json:"lastname,omitempty" bson:"lastname"`
Username string `json:"username" bson:"username"`
RegistrationDate primitive.DateTime `json:"registrationDate" bson:"registrationData"`
LastLogin primitive.DateTime `json:"lastLogin" bson:"lastLogin"`
}
var client *mongo.Client
func AddUser(response http.ResponseWriter, request *http.Request) {
collection := client.Database("hattip").Collection("user")
var user User
_ = json.NewDecoder(request.Body).Decode(&user)
insertResult, err := collection.InsertOne(context.TODO(), user)
if err != nil {
// здесь нужно понять какая именно ошибка.
fmt.Println("Error on inserting new user", err)
response.WriteHeader(http.StatusPreconditionFailed)
} else {
fmt.Println(insertResult.InsertedID)
response.WriteHeader(http.StatusCreated)
}
}
func main() {
client = GetClient()
err := client.Ping(context.Background(), readpref.Primary())
if err != nil {
log.Fatal("Couldn't connect to the database", err)
} else {
log.Println("Connected!")
}
router := mux.NewRouter()
router.HandleFunc("/person", AddUser).Methods("POST")
err = http.ListenAndServe("127.0.0.1:8080", router)
if err == nil {
fmt.Println("Server is listening...")
} else {
fmt.Println(err.Error())
}
}
func GetClient() *mongo.Client {
clientOptions := options.Client().ApplyURI("mongodb://127.0.0.1:27017")
client, err := mongo.NewClient(clientOptions)
if err != nil {
log.Fatal(err)
}
err = client.Connect(context.Background())
if err != nil {
log.Fatal(err)
}
return client
}
Если я добавляю запись, с полем username, данные которого уже есть в БД то получаю -
Error on inserting new user multiple write errors: [{write errors: [{E11000 duplicate key error collection: hattip.user index: username_unique dup key: { username: "dd" }}]}, {}]
в строке
fmt.Println("Error on inserting new user", err)
. Запись со строкой
dd в поле
username уже есть, а поле
username является уникальным индексом.
Мне нужно как-то понять, что ошибка именно
E11000 (duplicate key error collection).
Пока придумал сравнивать
err со всей строкой ошибки, которая возникает при дубликате уникального поля, но это же совсем не правильно. Может можно как-то получить доступ к коду ошибки из объекта
err, или может быть есть еще какие то способы?
Еще нашел вариант проверки с помощью пакета
mgo, но чтобы его использовать придется изучать новый пакет, переписывать подключение и так далее, но зато выглядит хорошо:
if mgo.IsDup(err) {
err = errors.New("Duplicate name exists for the shorturl")
}