Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Guna semula model dan alih keluar medan daripada respons dalam Fiber/MongoDB

Guna semula model dan alih keluar medan daripada respons dalam Fiber/MongoDB

WBOY
WBOYke hadapan
2024-02-08 21:27:181111semak imbas

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

Dalam artikel ini, editor PHP Zimo akan memperkenalkan cara memadam medan dan menggunakan semula model dalam respons Fiber/MongoDB. Apabila kami mendapat data daripada pangkalan data, kadangkala kami perlu memadam beberapa medan untuk memenuhi keperluan khusus atau untuk melindungi maklumat sensitif. Fiber/MongoDB ialah rangka kerja PHP popular yang membolehkan anda membina aplikasi web berprestasi tinggi dengan cepat. Dalam artikel ini, kami akan mempelajari cara untuk meningkatkan kebolehgunaan semula dan kebolehselenggaraan kod anda dengan menggunakan kuasa Fiber/MongoDB untuk mengalih keluar medan dan menggunakan semula model dalam aplikasi anda.

Kandungan soalan

Saya cuba untuk tidak membuat dinding kod dan tidak mengisytiharkan semula kod apabila ia tidak diperlukan.

Dua soalan utama saya sekarang ialah:

Dalam baris 47, ambil model pengguna sedia ada userCollection.FindOne(ctx, filter, opts).Decode(&user) 进行了覆盖/解码,但它没有被更新,第 46 行中的选项不被应用,除非我声明var user2 = models.User dan nyahkod kepada pengguna2 dalam baris 47, kemudian kembalikan pengguna2 dalam baris 49

Barisan 46 mempunyai opts := options.FindOne().SetProjection(bson.M{"password": 0}). Jika saya menggunakan user2 pengguna kedua daripada contoh di atas, ia mengembalikan kata laluan dalam respons JSON tetapi ia kosong. Adakah mungkin untuk mengalih keluar kunci kata laluan sepenuhnya daripada respons tanpa membuat model pengguna lain hanya untuk menggunakannya dalam respons?

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

Saya telah cuba mencipta model berasingan tanpa medan kata laluan UserResponse dan mengisytiharkan model Pengguna kedua dalam fungsi CreateUser untuk dapat melihat output FindOne melalui pilihan dalam respons.

Penyelesaian

Selepas beberapa jam memikirkannya dan menyiarkannya di sini, saya mengalami detik yang cemerlang.

Semua perubahan yang dibuat di sini adalah untuk mengisytiharkan semula pengguna sebagai model pengguna kosong:

    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)

Atas ialah kandungan terperinci Guna semula model dan alih keluar medan daripada respons dalam Fiber/MongoDB. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam