Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

es-client: non-JSON error responses report "Body is unusable" instead of the HTTP status

Đã đóng Phù hợp với người mới
#686 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
75/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
nodejs, typescript
Lĩnh vực
backend-api-design, cli

Hướng nghiên cứu

Lỗi nằm trong src/lib/es-client.ts dòng 125-132. Hãy bắt đầu bằng cách đọc tệp để hiểu luồng yêu cầu. Cách sửa là đọc phần thân phản hồi dưới dạng văn bản trước, sau đó thử phân tích cú pháp nó dưới dạng JSON, tương tự như cách kibana-client.ts và cloud-client.ts xử lý. Viết một bài kiểm tra để tái tạo lỗi bằng cách sử dụng máy chủ HTTP giả lập trả về phản hồi lỗi không phải JSON, sau đó xác minh rằng bản sửa lỗi trả về mã trạng thái và phần thân chính xác.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Summary

Any non-2xx response whose body is not valid JSON surfaces as Error: Body is unusable: Body has already been read, losing the status code. That is undici's TypeError — the error branch of
EsClient.request reads the body twice. Deterministic, not timing-dependent.

The usual way to hit it is a reverse proxy in front of Elasticsearch: proxy_read_timeout expiring
on a long ES|QL query returns an nginx HTML 504, and the CLI reports Body is unusable instead of
504 — pointing suspicion at the client rather than the proxy.

Root cause

src/lib/es-client.ts#L125-L132:

if (!response.ok) {
  let body: unknown
  try {
    body = await response.json()   // consumes the stream
  } catch {
    body = await response.text()   // ← throws: body already consumed
  }
  throw new EsResponseError(response.status, body)
}

response.json() disturbs the body even when it rejects, so the catch branch can never read it.

Reproduction

cat > elasticrc-local.yml <<'YAML'
current_context: local
contexts:
  local:
    elasticsearch:
      url: http://127.0.0.1:9999
      auth: { api_key: ZmFrZTpmYWtl }
YAML
chmod 0600 elasticrc-local.yml
export ELASTIC_CLI_CONFIG_FILE="$PWD/elasticrc-local.yml" NO_PROXY=localhost,127.0.0.1

# stand in for "ES behind a proxy that timed out"
node -e 'require("http").createServer((q,s)=>{s.writeHead(504,{"content-type":"text/html"});s.end("<html><body>504 Gateway Time-out</body></html>")}).listen(9999,"127.0.0.1")' &

elastic es esql query --query 'FROM x | LIMIT 1' --format txt
# Error: Body is unusable: Body has already been read     (exit 1)

Same for 502, 503, text/plain and empty bodies. A JSON error body works correctly
(Error: illegal_argument_exception: …). Reproduced on v0.4.0 and v0.5.0, Node v26.8.1,
Linux x86_64, against Elasticsearch 9.5.3.

Suggested fix

Read once, then parse — as kibana-client.ts#L212
and cloud-client.ts#L75
already do in this repo:

const text = await response.text()
let body: unknown
try {
  body = JSON.parse(text)
} catch {
  body = text
}
throw new EsResponseError(response.status, body)

EsResponseError's message should also carry the status, since a string body currently renders as
bare HTML. Happy to open a PR with tests for an HTML and an empty error body.

Context

Introduced by #281 (native-fetch EsClient); @elastic/transport handled it correctly. Present in
every release since v0.2.0 and on main today. #588 fixed the same blind-JSON.parse mistake on
the success branch of this file — this is the error branch.

Ngôn ngữ chính
TypeScript
Star
47
Fork
27
Merge trung bình
2 ngày 2 giờ
Pull request đã merge (30 ngày)
57

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của elastic/cli

Tất cả issue của elastic/cli

Issue tương tự

Thêm issue về TypeScript

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.