php小编子墨在这篇文章中将介绍如何在Fiber/MongoDB的响应中删除字段并重用模型。当我们从数据库中获取数据时,有时候我们需要删除一些字段,以满足特定的需求或者保护敏感信息。Fiber/MongoDB是一个流行的PHP框架,使用它可以快速构建高性能的Web应用程序。在本文中,我们将学习如何通过使用Fiber/MongoDB的强大功能来删除字段,并在应用程序中重用模型,以提高代码的可重用性和可维护性。
我试图不创建代码墙,并且在不需要时不重新声明代码。
我现在的两个主要问题是:
在第 47 行中,对现有用户模型 userCollection.FindOne(ctx, filter, opts).Decode(&user)
进行了覆盖/解码,但它没有被更新,第 46 行中的选项不被应用,除非我声明var user2 = models.User
,并在第 47 行解码为 user2,然后在第 49 行返回 user2
第46行有opts := options.FindOne().SetProjection(bson.M{"password": 0})
。如果我使用上面示例中的第二个用户 user2,它会在 JSON 响应中返回密码,但它为空。是否可以从响应中完全删除密码密钥,而不创建另一个用户模型只是为了在响应中使用它?
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}}) }
我已经尝试创建一个不带密码字段的单独模型 UserResponse
并在 CreateUser 函数中声明第二个用户模型,以便能够通过响应中的选项查看 FindOne 的输出。
经过几个小时的弄清楚并将其发布到此处后,我得到了一个辉煌的时刻。
此处所做的所有更改是将用户重新声明为空用户模型:
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)
以上是重用模型并从 Fiber/MongoDB 的响应中删除字段的详细内容。更多信息请关注PHP中文网其他相关文章!