Перейти сохранить ошибку сканирования файла: http: неверный Читать на закрытом теле - PullRequest
1 голос
/ 02 мая 2019

Когда я читаю файл 1000 записей, я получаю сообщение об ошибке каждые 10-20 записей:

scan file error: http: invalid Read on closed Body

Вот мой код

func parser(resp http.ResponseWriter, req *http.Request){

var count int

//....some of my code..

resp.Header().Set("Content-Type", "text/plain")
    scanner := bufio.NewScanner(req.Body)

    ctx := context.Background()
    for scanner.Scan() {
        itemID := scanner.Text()
        category := api.SearchAPI.FindCategory(itemID, lang, ctx)
        _, _ = fmt.Fprintf(resp, "%v,%v \n", itemID, category)
        count++
    }

    if err := scanner.Err(); err != nil {
        logger.Errorf("scan file error: %v", err)
        http.Error(resp, err.Error(), http.StatusBadRequest)
        return
    }

   //.....
}

1 Ответ

1 голос
/ 02 мая 2019

Похоже, ваш сервер закрывает соединение. Проверьте, есть ли у вас таймауты и почему запрос занимает так много времени. Вы можете обработать scanner.Text () асинхронно, чтобы сканирование не блокировалось, чтобы searchAPI отвечал, а тело запроса не открывалось слишком долго.

    resp.Header().Set("Content-Type", "text/plain")
    scanner := bufio.NewScanner(req.Body)

    ctx := context.Background()
    for scanner.Scan() {
        itemID := scanner.Text()
        go func(itemID string){
           category := api.SearchAPI.FindCategory(itemID, lang, ctx)
           _, _ = fmt.Fprintf(resp, "%v,%v \n", itemID, category)
           count++ //ENSURE YOU HAVE AN ATOMIC COUNTER INCREMENT, OR INCREMENT AFTER itemID IS READ
        }(itemID)
    }

    if err := scanner.Err(); err != nil {
        logger.Errorf("scan file error: %v", err)
        http.Error(resp, err.Error(), http.StatusBadRequest)
        return
    }

   //.....
}

Кроме того, вы можете просто собрать все идентификаторы элементов в срезе, закрыть тело запроса и затем обработать их один за другим.

resp.Header().Set("Content-Type", "text/plain")
    scanner := bufio.NewScanner(req.Body)

    ctx := context.Background()
    itemIDs := make([]string, 0)
    for scanner.Scan() {
        itemID := scanner.Text()
        itemIDs = append(itemIDs, itemID)
    }

    if err := scanner.Err(); err != nil {
        logger.Errorf("scan file error: %v", err)
        http.Error(resp, err.Error(), http.StatusBadRequest)
        return
    }

    for _, itemID := range itemIDs {
        category := api.SearchAPI.FindCategory(itemID, lang, ctx)
        _, _ = fmt.Fprintf(resp, "%v,%v \n", itemID, category)
        count++
    }

   //.....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...