@Abcdefgk

Почему данные на странице дублируются, дублируются и дублируются и т.д.?

Пожалуйста, объясните мне этот удивительный эффект кто-нибудь.
Вот у меня код берёт из БД простую таблицу с четырьмя полями обычным запросом SELECT * FROM books,
отправляет её в заготовленную структуру, читает файл с шаблоном, парсит его и отправляет с данными в ответ клиенту, вот так (фрагмент, конечно):
for rows.Next() {
			bk := new(Book)
			err := rows.Scan(&bk.Isbn, &bk.Title, &bk.Author, &bk.Price)
			if err != nil {
				http.Error(w, http.StatusText(500), 500)
				return
			}
			Books.Items = append(Books.Items, bk)
		}

		if err = rows.Err(); err != nil {
			http.Error(w, http.StatusText(500), 500)
			return
		}

		f, err := ioutil.ReadFile("file.tpl")
		if err != nil {
			fmt.Println(err)
		}

		html, err := template.New("books").Parse(string(f))
		if err != nil {
			fmt.Println(err)
		}

		w.Header().Set("Cache-Control", "no-cache")

		html.Execute(w, Books)

такой шаблончик:
<body>
	{{ range .Items }}
		<div><b>{{ .Isbn }}</b> {{ .Title }} {{ .Author }} {{ .Price }}</div>
	{{else}}
		<div><strong>no rows</strong></div>
	{{end}}
	<br>

и благополучно выводит на странице в браузере, вот так:
5b64aac922e59401639998.jpeg
Теперь если я просто обновлю страницу, то те же пять div-ов будут выведены снова, но и с прошлого запроса останутся (т.е. всего их будет 10), вот так:
5b64ab66642d8350188634.jpeg
если ещё раз вызову страницу, то их будет 5х3=15 и т.д.
На странице есть формочка, как видите, которой в БД можно добавить строку. Если я заполню поля и нажму кнопку - строчка в базу благополучно добавится, страница естественным образом перезагрузится, и на ней окажутся прошлые 15 (или больше) строк плюс новые теперь уже шесть (бывшие пять и добавленная строчка в таблице).
И какое, подскажите, у этого есть объяснение?
Я уже и заголовок, как можно увидеть, приписал к ответу Cache-Control - no-cache - что, конечно, ни к чему, но я не понимаю.
Новый запрос, новый ответ, новая страница - данные умножаются.
Как это? Что не так?
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
yellow79
@yellow79
Senior Software Engineer
похоже Books объявлен глобально и не очищается после запроса, при каждом запросе вы пушите в него данные Books.Items = append(Books.Items, bk) отсюда и результат
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы