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.
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.
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!