Heim  >  Artikel  >  Backend-Entwicklung  >  Modelle wiederverwenden und Felder aus Antworten in Fiber/MongoDB entfernen

Modelle wiederverwenden und Felder aus Antworten in Fiber/MongoDB entfernen

WBOY
WBOYnach vorne
2024-02-08 21:27:181111Durchsuche

重用模型并从 Fiber/MongoDB 的响应中删除字段

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.

Frageninhalt

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.

Workaround

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen