In diesem Artikel stellt PHP-Editor Zimo vor, wie man Felder löscht und Modelle in Fiber/MongoDB-Antworten wiederverwendet. Wenn wir Daten aus der Datenbank abrufen, müssen wir manchmal einige Felder löschen, um bestimmte Anforderungen zu erfüllen oder vertrauliche Informationen zu schützen. Fiber/MongoDB ist ein beliebtes PHP-Framework, mit dem Sie schnell leistungsstarke Webanwendungen erstellen können. In diesem Artikel erfahren Sie, wie Sie die Wiederverwendbarkeit und Wartbarkeit Ihres Codes verbessern, indem Sie die Leistungsfähigkeit von Fiber/MongoDB nutzen, um Felder zu entfernen und Modelle in Ihrer Anwendung wiederzuverwenden.
Ich versuche, keine Codewände zu erstellen und Code nicht neu zu deklarieren, wenn er nicht benötigt wird.
Meine zwei Hauptfragen im Moment sind:
Nehmen Sie in Zeile 47 das vorhandene Benutzermodell userCollection.FindOne(ctx, filter, opts).Decode(&user)
进行了覆盖/解码,但它没有被更新,第 46 行中的选项不被应用,除非我声明var user2 = models.User
und dekodieren Sie es in Zeile 47 zu Benutzer2 und geben Sie dann in Zeile 49 Benutzer2 zurück
Linie 46 hat opts := options.FindOne().SetProjection(bson.M{"password": 0})
. Wenn ich den zweiten Benutzer user2 aus dem obigen Beispiel verwende, wird das Passwort in der JSON-Antwort zurückgegeben, aber es ist leer. Ist es möglich, den Passwortschlüssel vollständig aus der Antwort zu entfernen, ohne ein anderes Benutzermodell zu erstellen, nur um ihn in der Antwort zu verwenden?
func CreateUser(c *fiber.Ctx) error { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() var user models.User //validate the request body if err := c.BodyParser(&user); err != nil { return c.Status(http.StatusBadRequest).JSON(responses.UserResponse{Status: http.StatusBadRequest, Message: "error", Data: &fiber.Map{"data": err.Error()}}) } //use the validator library to validate required fields if validationErr := validate.Struct(&user); validationErr != nil { return c.Status(http.StatusBadRequest).JSON(responses.UserResponse{Status: http.StatusBadRequest, Message: "error", Data: &fiber.Map{"data": validationErr.Error()}}) } var email = &user.Email count, err := userCollection.CountDocuments(ctx, bson.M{"email": email}) if err != nil { return c.Status(http.StatusBadRequest).JSON(responses.UserResponse{Status: http.StatusBadRequest, Message: "error", Data: &fiber.Map{"data": "Something went wrong"}}) } if count > 0 { return c.Status(http.StatusBadRequest).JSON(responses.UserResponse{Status: http.StatusBadRequest, Message: "error", Data: &fiber.Map{"data": "Email already in use"}}) } //set the status, hash password, set activate token and updated at status := 0 password := hashPassword(*user.Password) activateToken := uuid.New().String() updatedAt, _ := time.Parse(time.RFC3339, time.Now().Format(time.RFC3339)) //create user object user.ID = primitive.NewObjectID() user.Password = &password user.Status = &status user.ResetToken = &activateToken user.CreatedAt = updatedAt user.UpdatedAt = updatedAt result, err := userCollection.InsertOne(ctx, user) if err != nil { return c.Status(http.StatusInternalServerError).JSON(responses.UserResponse{Status: http.StatusInternalServerError, Message: "error", Data: &fiber.Map{"data": err.Error()}}) } //get created user from the DB and cast it into UserResponse model filter := bson.M{"_id": result.InsertedID} opts := options.FindOne().SetProjection(bson.M{"password": 0}) userCollection.FindOne(ctx, filter, opts).Decode(&user) //return created user return c.Status(http.StatusOK).JSON(responses.UserResponse{Status: http.StatusOK, Message: "success", Data: &fiber.Map{"data": user}}) }
Ich habe versucht, ein separates Modell ohne das Passwortfeld zu erstellen UserResponse
und ein zweites Benutzermodell in der CreateUser-Funktion zu deklarieren, um die Ausgabe von FindOne über die Optionen in der Antwort sehen zu können.
Nachdem ich es ein paar Stunden lang herausgefunden und hier gepostet hatte, hatte ich einen großartigen Moment.
Alle hier vorgenommenen Änderungen bestehen darin, den Benutzer als leeres Benutzermodell neu zu deklarieren:
user = models.User{} // <- the fix filter := bson.M{"_id": result.InsertedID} opts := options.FindOne().SetProjection(bson.M{"password": 0}) userCollection.FindOne(ctx, filter, opts).Decode(&user)
Das obige ist der detaillierte Inhalt vonModelle wiederverwenden und Felder aus Antworten in Fiber/MongoDB entfernen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!