@vGrabko99
html, css, js, php, golang, mysql

Как исправить http: multiple response.WriteHeader calls?

Есть функция
import (
	"api/kernel/httprouter"
	"api/kernel/status"
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"net/http"
)
func SelectMethods(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {

	rows, err := DB.Query("SELECT * FROM dev_method WHERE name=?", ps.ByName("methods"))
	if err != nil {
		status.Code503(w, r)
	}
	defer rows.Close()
	bks := make([]*dev_method, 0)
	for rows.Next() {
		bk := new(dev_method)
		err := rows.Scan(&bk.id, &bk.id_menu, &bk.name, &bk.description)
		if err != nil {
			status.Code503(w, r)
		}
		bks = append(bks, bk)
	}
	if err = rows.Err(); err != nil {
		status.Code503(w, r)
	}
	i := 0
	fmt.Fprintf(w, "{")
	for _, bk := range bks {
		i++
		fmt.Fprintf(w, "'%s':['id_menu':'%s','name':'%s','description':'%s']", bk.id, bk.id_menu, bk.name, bk.description)
	}
	fmt.Fprintf(w, "}")

	if i == 0 {
		status.Code400(w, r)
	}
}

status.go
pastebin.com/zMXdargE
router.go
pastebin.com/QzrvJMCw
Если ps.ByName("methods") нету в бд то в терминал пишет
2015/10/23 15:48:11 http: multiple response.WriteHeader calls


Я подозреваю что надо в конструкции
if err = rows.Err(); err != nil {
		status.Code503(w, r)
	}

как то остановить дальнейшее выполнение функции.
Возникает три вопроса.
1. Как исправить фун-цию?
2. Как остановить выполнение любой фун-ции в любом месте?
3. Как избавиться от конструкции
i := 0
	fmt.Fprintf(w, "{")
	for _, bk := range bks {
		i++
		fmt.Fprintf(w, "'%s':['id_menu':'%s','name':'%s','description':'%s']", bk.id, bk.id_menu, bk.name, bk.description)
	}
	fmt.Fprintf(w, "}")

	if i == 0 {
		status.Code400(w, r)
	}
? зарание спасибо.
  • Вопрос задан
  • 2062 просмотра
Решения вопроса 1
Ошибка возникает потому что код ответа надо писать максимум один раз и перед записью тела ответа. Делайте return при ошибке, это прервёт функцию.
JSON лучше всего формировать с помощью модуля encoding/json, тогда избавитесь от этой некрасивой конструкции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы