Maison  >  Article  >  développement back-end  >  Réutilisez les modèles et supprimez les champs des réponses dans Fiber/MongoDB

Réutilisez les modèles et supprimez les champs des réponses dans Fiber/MongoDB

WBOY
WBOYavant
2024-02-08 21:27:181160parcourir

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

Dans cet article, l'éditeur PHP Zimo présentera comment supprimer des champs et réutiliser des modèles dans les réponses Fibre/MongoDB. Lorsque nous récupérons des données de la base de données, nous devons parfois supprimer certains champs pour répondre à des besoins spécifiques ou pour protéger des informations sensibles. Fiber/MongoDB est un framework PHP populaire qui vous permet de créer rapidement des applications Web hautes performances. Dans cet article, nous apprendrons comment améliorer la réutilisabilité et la maintenabilité de votre code en utilisant la puissance de Fiber/MongoDB pour supprimer des champs et réutiliser des modèles dans votre application.

Contenu de la question

J'essaie de ne pas créer de murs de code et de ne pas redéclarer le code lorsqu'il n'est pas nécessaire.

Mes deux principales questions en ce moment sont :

À la ligne 47, prenez le modèle utilisateur existant userCollection.FindOne(ctx, filter, opts).Decode(&user) 进行了覆盖/解码,但它没有被更新,第 46 行中的选项不被应用,除非我声明var user2 = models.User et décodez en user2 à la ligne 47, puis renvoyez user2 à la ligne 49

La ligne 46 a opts := options.FindOne().SetProjection(bson.M{"password": 0}). Si j'utilise le deuxième utilisateur user2 de l'exemple ci-dessus, il renvoie le mot de passe dans la réponse JSON mais il est vide. Est-il possible de supprimer complètement la clé de mot de passe de la réponse sans créer un autre modèle utilisateur uniquement pour l'utiliser dans la réponse ?

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}})
}

J'ai essayé de créer un modèle séparé sans le champ de mot de passe UserResponse et de déclarer un deuxième modèle User dans la fonction CreateUser pour pouvoir voir la sortie de FindOne via les options de la réponse.

Solution de contournement

Après quelques heures passées à le comprendre et à le publier ici, j'ai passé un moment génial.

Toutes les modifications apportées ici consistent à redéclarer l'utilisateur en tant que modèle d'utilisateur vide :

    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)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer