Skip to main content

Create your configuration file for your project

จาก section ก่อนหน้าจะสังเกตได้ว่าตอนนี้เรากำลังเชื่อม database ผ่าน connection string โดยเขียนไปในโค้ดโดยตรง ซึ่งถือเป็นสิ่งที่ไม่ควรทำครับ และสิ่งที่จะมาช่วยในส่วนนั้นก็คือการทำไฟล์เก็บ config หรือ token ต่าง ๆ ที่เราไม่ต้องการให้ผู้อื่นเห็นครับ เวลาเราอัพโหลดโค้ดขึ้น Github และเปิดเป็น public ก็จะไม่มีใครเห็นข้อมูลพวกนี้นั่นเอง (แต่อย่าลืมใส่ไปใน .gitignore นะครับ 55555)

ก่อนอื่นสร้างไฟล์ config.yaml ขึ้นมาก่อนครับ แล้วใส่ข้อมูลที่เราอยากเก็บไปใน format yaml ได้เลย

JWT_SECRET: yoursecret
DB_HOST: yourconnectionstring

ต่อไปเรามาสร้าง model ที่จะเก็บ configuration ของเรากันดีกว่าครับ อย่างในตัวอย่างตอนนี้มี 2 value ซึ่งเราก็จะสร้าง struct ที่มี 2 value นั้นครับ โดยสร้าง folder config ขึ้นมา แล้วสร้าง ไฟล์ในนั้นชื่อ config.go

package config

type config struct {
	JWT_SECRET string `yaml:"JWT_SECRET"`
	DB_HOST    string `yaml:"DB_HOST"`
}

หลังจากได้ model แล้วเราก็ต้องสร้างไฟล์ที่จะ run ทันทีเมื่อ project เราทำงานซึ่งจะคล้ายกับ function main ของเรานั่นเอง สิ่งนั้นคือ function init() นั่นเอง

โดยก่อนหน้านั้นเราจำเป็นต้องมี library "gopkg.in/yaml.v2" ก่อนด้วยนะครับ โดย install ง่าย ๆ แค่พิมพ์คำสั่ง $ go get gopkg.in/yaml.v2 library นี้ก็จะอยู่ใน go.mod เราโดยอัตโนมัติ

package config

var C = new(config)

func init() {
	yml, err := ioutil.ReadFile("config.yaml")
	if err != nil {
		panic(err)
	}
	err = yaml.Unmarshal(yml, C)
	if err != nil {
		panic(err)
	}
}

โค้ดส่วนนี้ไม่มีอะไรมากครับ แค่ก่อนอื่นเราสร้างตัวแปล global ที่เป็น type config ที่เราสร้างไว้ก่อนหน้านี้ หลังจากนั้นสั่งอ่านไฟล์ที่ชื่อว่า config.yaml ที่เก็บข้อมูลของเราอยู่ แล้วยัดค่าที่อ่านได้นั้นลงไปในตัวแปลที่สร้างไว้

เท่านี้เราก็จะสามารถเรียกใช้ config ในไฟล์ไหนก็ได้ภายใน project เลยครับ

package main

func main() {
	s := &http.Server{
		Addr:           ":8080",
		ReadTimeout:    10 * time.Second,
		WriteTimeout:   10 * time.Second,
		MaxHeaderBytes: 1 << 20,
	}

	db, err := sql.Open("mysql", config.C.DB_HOST) // Like this
	if err != nil {
		panic(err)
	}
	userRepository := repository.NewRepositoryDB(db)
	userService := service.NewUserService(userRepository)
	userHandler := handler.NewUserHandler(userService)

	http.HandleFunc("/signup", userHandler.SignUp)
	http.HandleFunc("/signin", userHandler.SignIn)
	http.HandleFunc("/list", userHandler.ListUsers)

	if err := s.ListenAndServe(); err != nil {
		panic(err)
	}

	defer db.Close()
}