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

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