返回顶部
首页 > 资讯 > 精选 >重用模型并从 Fiber/MongoDB 的响应中删除字段
  • 266
分享到

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

2024-02-08 21:02:24 266人浏览 薄情痞子
摘要

PHP小编子墨在这篇文章中将介绍如何在Fiber/mongoDB的响应中删除字段并重用模型。当我们从数据库中获取数据时,有时候我们需要删除一些字段,以满足特定的需求或者保护敏感信息。F

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 的响应中删除字段的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 重用模型并从 Fiber/MongoDB 的响应中删除字段

本文链接: https://lsjlt.com/news/562073.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作