Skip to main content

Create your configuration file for your project

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

ก่อนอื่นสร้างไฟล์ config.yaml ขึ้นมาก่อนครับ แล้วก็ใส่ข้อมูลที่เราอยากเก็บไปใน format 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()
}