---
title: "Sửa lỗi Script error khiến thông điệp, file và số dòng bị ẩn"
description: "Script error. với dòng 0 và không có stack trace nghĩa là trình duyệt đã ẩn một lỗi từ script ở origin khác. Thêm crossorigin và header CORS để lấy lại thông điệp."
canonical: "https://logbrew.co/vi/errors/script-error"
last_updated: "2026-11-10"
---

# Sửa lỗi Script error khiến thông điệp, file và số dòng bị ẩn

`Script error.` với dòng 0 và không có stack trace nghĩa là trình duyệt đã ẩn một lỗi từ script ở origin khác. Thêm `crossorigin` và header CORS để lấy lại thông điệp.

Đã thử nghiệm ngày 10 tháng 11, 2026 với Chromium 152, @logbrew/browser 0.1.21 và @logbrew/sdk 0.1.44

Tác giả [Furkan Erday](https://github.com/furkanerday). Furkan Erday là nhà sáng lập LogBrew. Anh xây dựng LogBrew bằng Claude Code và Codex mỗi ngày.

Canonical: https://logbrew.co/vi/errors/script-error

## Trang nhận được gì từ một script ném lỗi

| Cách nạp script | Script đã chạy | Chi tiết lỗi |
| --- | --- | --- |
| Từ chính origin của trang | Đã chạy | Đầy đủ |
| Từ origin khác | Đã chạy | `Script error.` |
| Origin khác, có `crossorigin` và header CORS | Đã chạy | Đầy đủ |
| Origin khác, có `crossorigin` nhưng không có header | Bị chặn | Không có |

1 script, nạp theo 4 cách. Đầy đủ nghĩa là có thông điệp, file, dòng 1, cột 7 và stack trace, đọc từ sự kiện `error` trên `window`.

## Lấy lại lỗi đầy đủ

### Nạp script với thuộc tính crossorigin

Thuộc tính này bảo trình duyệt tải file bằng CORS. Khi máy chủ cho phép, trình duyệt chuyển thông điệp thật, file, dòng và stack trace cho các listener lỗi của trang.

```bash
<script src="https://cdn.example.com/app.js" crossorigin="anonymous"></script>
```

### Gửi header CORS từ máy chủ chứa file

Máy chủ chứa script phải trả về `Access-Control-Allow-Origin` đặt bằng origin của trang bạn, hoặc `*` cho file công khai. Trong lần thử của chúng tôi, chỉ riêng header này đã biến `Script error.` thành thông điệp đầy đủ.

```bash
Access-Control-Allow-Origin: *
```

### Kiểm tra file vẫn nạp được

Khi đặt `crossorigin` mà không có header, trình duyệt chặn file và script không bao giờ chạy. Console khi đó hiện `blocked by CORS policy` và `net::ERR_FAILED`, còn phần tử `script` phát sự kiện `error`.

Kết quả

```text
Access to script at 'http://127.0.0.1:4874/plain/throws.js?scenario=script-cross-origin-attr-no-header' from origin 'http://127.0.0.1:4873' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Failed to load resource: net::ERR_FAILED
```

### Hoặc phục vụ script từ chính origin của bạn

Script từ chính origin của trang không bao giờ bị ẩn lỗi. Đóng gói file cùng ứng dụng của bạn, hoặc proxy nó qua domain của bạn, và không cần header nào cả.

## Xử lý những lỗi bị ẩn mà bạn vẫn nhận

### Đếm chúng, rồi tìm script

`Script error.` không mang theo gì để sửa. Mỗi lỗi như vậy nghĩa là một script ở origin khác đã ném lỗi. Tìm các thẻ không có `crossorigin` và bắt đầu từ những thẻ nạp trên mọi trang.

### Đọc thông điệp thật trong console

Trình duyệt in lỗi đầy đủ ra console ngay cả khi ẩn nó khỏi các listener của bạn. Trong lần thử của chúng tôi, console hiện `Uncaught Error: Keg is empty` trong khi `window.onerror` chỉ nhận `Script error.`.

### Quyết định cách xử lý thẻ của bên thứ ba

Một widget chat hoặc thẻ analytics không có header CORS để lại cho bạn 2 lựa chọn. Giữ nguyên và chấp nhận lỗi bị ẩn, hoặc thêm `crossorigin` để header bị thiếu chặn thẻ đó và hiện ra như một lượt nạp thất bại.

## Kết quả khi chúng tôi thử nghiệm

Chúng tôi đặt 1 script ném lỗi, `throw new Error("Keg is empty: no beer left for order 42");`, lên 2 máy chủ cục bộ. Trang chạy tại `http://127.0.0.1:4873` trên Chromium 152 có cài `@logbrew/browser` 0.1.21, và máy chủ thứ hai tại `http://127.0.0.1:4874` đóng vai CDN. Chúng tôi nạp script theo 4 cách và mỗi lần đều đọc sự kiện `error` trên `window`.

Từ chính origin của trang, sự kiện mang theo `Uncaught Error: Keg is empty: no beer left for order 42`, file `/throws.js`, dòng 1, cột 7 và một đối tượng `Error` có stack trace. Từ origin khác không có `crossorigin`, sự kiện mang theo `Script error.`, tên file rỗng, dòng 0, cột 0 và không có đối tượng `Error`. Console vẫn in thông điệp đầy đủ.

Với `crossorigin="anonymous"` và `Access-Control-Allow-Origin: *` trên CDN, sự kiện lại mang theo chi tiết đầy đủ. Với thuộc tính mà không có header, trình duyệt chặn file, script không chạy, và phần tử `script` phát sự kiện `error`.

## Vì sao trình duyệt ẩn thông điệp

Chuẩn HTML ẩn lỗi từ những script mà trang tải từ origin khác không qua CORS. Thuật toán của nó đánh dấu lỗi là bị ẩn khi phản hồi thuộc loại CORS-cross-origin, rồi báo lỗi dưới dạng `Script error.` không có URL, dòng 0, cột 0 và không có đối tượng lỗi.

Trình duyệt coi nội dung lỗi của script cross-origin là dữ liệu của script đó, nên trang không nhận được gì. Trang MDN về `crossorigin` nói đúng điều này trong 1 dòng. Quyền truy cập vào log lỗi qua `window.onerror` bị giới hạn với những script như vậy.

whatwg/html#2440 đề nghị một cách lấy chi tiết mà không cần CORS. Nó bị đóng vào tháng 7 năm 2024, đúng ngày whatwg/html#10514 được mở để báo rằng các trình duyệt không ẩn cùng một trường hợp theo cùng một cách. Báo cáo đó vẫn đang mở.

## LogBrew ghi nhận những gì

Với chi tiết đầy đủ, SDK trình duyệt gửi 1 vấn đề tên `Browser error: Error`, có một stack frame cho `/throws.js` tại dòng 1, cột 7, đường dẫn mã nguồn và khóa gom nhóm `browser.error:Error:/throws.js`. Mỗi script ném lỗi có vấn đề riêng.

Với lỗi bị ẩn, vấn đề có cùng tên, không có stack frame, dòng 0, cột 0 và khóa gom nhóm `browser.error:Error`. Các lỗi bị ẩn dùng chung 1 vấn đề đó, nên số lần xảy ra của nó cho biết bạn còn bao nhiêu lỗi chưa nhìn thấy.

Cả hai sự kiện đều mang đường dẫn trang, runtime `Chromium 152` trên `macOS` và một breadcrumb `page_view`. Không sự kiện nào mang nội dung thông điệp. SDK đánh dấu nó là `redacted`.

## Câu hỏi thường gặp

### Script error. trong JavaScript nghĩa là gì?

Một script ở origin khác đã ném lỗi, và trình duyệt ẩn chi tiết khỏi trang vì file không được nạp bằng CORS. Bản thân script vẫn chạy.

### Vì sao Script error. có dòng 0 và không có stack trace?

Chuẩn HTML thay thế thông điệp, file, dòng, cột và đối tượng lỗi khi ẩn một lỗi. Chỉ còn lại chuỗi `Script error.`.

### Script error. có nghĩa là script không nạp được không?

Không. Script không nạp được sẽ phát sự kiện `error` trên phần tử `script` của nó và không bao giờ chạy. `Script error.` nghĩa là script đã chạy và ném lỗi.

### Tôi có thể xem thông điệp mà không đổi gì ở máy chủ không?

Trong console trình duyệt thì có. Trong hệ thống theo dõi lỗi của bạn thì không. Trang cần `crossorigin` trên thẻ và header CORS từ máy chủ, hoặc script nằm trên chính origin của bạn.

### Tôi có nên lọc bỏ Script error. khỏi theo dõi lỗi không?

Đếm thay vì lọc bỏ. Con số cho biết bạn còn bao nhiêu lỗi chưa thấy, và nó giảm về 0 khi mọi script cross-origin đều nạp bằng CORS.

## Đếm những lỗi bạn chưa nhìn thấy

SDK trình duyệt của LogBrew giữ mọi lỗi bị ẩn trong 1 vấn đề và gán cho mỗi lỗi thật file, dòng và stack trace. Bắt đầu với gói miễn phí rộng rãi, không cần thẻ.

[Bắt đầu miễn phí](https://logbrew.co/vi)

## Nguồn

- [MDN, Window: error event](https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event)
- [MDN, crossorigin attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/crossorigin)
- [HTML Standard, Runtime script errors](https://html.spec.whatwg.org/multipage/webappapis.html#runtime-script-errors)
- [whatwg/html#2440](https://github.com/whatwg/html/issues/2440)
- [whatwg/html#10514](https://github.com/whatwg/html/issues/10514)

## Thêm cách sửa lỗi JavaScript

- [Sửa lỗi Failed to fetch và phân biệt 3 nguyên nhân](https://logbrew.co/vi/errors/failed-to-fetch)
- [Những lỗi JavaScript chúng tôi đã tái hiện, và cách sửa từng lỗi](https://logbrew.co/vi/errors)
