Modelle wiederverwenden und Felder aus Antworten in Fiber/MongoDB entfernen

WBOY
Freigeben: 2024-02-08 21:27:18
nach vorne
1130 Leute haben es durchsucht

重用模型并从 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}})
}
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!