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