Khắc phục lỗi Node.js EACCES: Quyền bị từ chối

intermediate💚 Node.js2026-03-16| Node.js, npm, Linux (Ubuntu, Debian, Fedora), macOS (Ventura, Sonoma, v.v.)

Error Message

Error: EACCES: permission denied

Lỗi: EACCES: quyền bị từ chối

Gặp phải lỗi EACCES: permission denied có thể là một vấn đề lớn đối với các nhà phát triển Node.js, đặc biệt là khi sử dụng npm (Node Package Manager). Lỗi này có nghĩa là Node.js hoặc npm đã cố gắng truy cập một tệp hoặc thư mục nhưng không có quyền cần thiết. Bạn thường sẽ thấy nó khi cài đặt các gói toàn cục, chạy script hoặc làm việc với các thư mục node_modules cụ thể của dự án.

Giải thích và Nguyên nhân gốc

Về cốt lõi, EACCES là một lỗi hệ điều hành, đặc biệt liên quan đến quyền truy cập hệ thống tệp. Khi bạn thấy "permission denied" (quyền bị từ chối), điều đó có nghĩa là tài khoản người dùng hiện tại của bạn thiếu các quyền đọc, ghi hoặc thực thi cần thiết cho một thao tác cụ thể. Đối với người dùng Node.js và npm, đây là những kịch bản phổ biến nhất:

  • Cài đặt gói npm toàn cục: Theo mặc định, npm cố gắng cài đặt các gói toàn cục vào các thư mục trên toàn hệ thống. Ví dụ, điều này thường là /usr/local trên macOS, hoặc /usr/bin/usr/local/bin trên Linux. Các vị trí này thường yêu cầu quyền root (quản trị viên) để thực hiện thay đổi. Nếu bạn cố gắng cài đặt một gói toàn cục mà không có sudo, bạn sẽ nhanh chóng gặp phải vấn đề về quyền.
  • Quyền không đúng từ việc sử dụng sudo trước đó: Bạn đã bao giờ chạy npm install -g hoặc thậm chí npm install cục bộ với sudo chưa? Nếu có, một số tệp và thư mục có thể đã được tạo hoặc thay đổi với quyền sở hữu của root. Sau đó, khi bạn cố gắng quản lý các tệp này với tư cách người dùng thông thường, bạn chắc chắn sẽ gặp lỗi EACCES.
  • Bộ nhớ cache npm bị hỏng: Đôi khi, bộ nhớ cache npm của bạn có thể bị hỏng. Nó có thể chứa các tệp có quyền không đúng, sau đó gây ra sự cố trong quá trình cài đặt gói tiếp theo.
  • Các thư mục node_modules hoặc build cụ thể của dự án: Mặc dù ít thường xuyên hơn, bạn có thể gặp lỗi này trong một dự án Node.js cụ thể. Nếu thư mục node_modules của dự án đó hoặc các thư mục đầu ra build của nó thuộc sở hữu của một người dùng khác, hoặc có quyền quá hạn chế, bạn có thể sẽ gặp sự cố khi chạy các script cục bộ hoặc xây dựng ứng dụng.

Các cách khắc phục từng bước

Tùy chọn 1: Cấu hình thư mục mặc định của npm (Khuyến nghị cho các gói toàn cục)

Cách tiếp cận này là an toàn nhất và được khuyến nghị cao nhất để xử lý các gói npm toàn cục. Thay vì điều chỉnh quyền cho các thư mục hệ thống, bạn chỉ cần yêu cầu npm cài đặt các gói toàn cục vào một thư mục thuộc sở hữu của tài khoản người dùng của bạn.

  • Tìm thư mục toàn cục hiện tại của npm:

npm config get prefix


Bạn thường sẽ thấy đầu ra như `/usr/local` hoặc `/usr/bin`.

  
  - **Tạo một thư mục dành riêng cho các cài đặt toàn cục:** Chọn một vị trí trong thư mục chính của người dùng của bạn. Một quy ước được chấp nhận rộng rãi là `~/.npm-global`.
    ```bash
mkdir -p ~/.npm-global
  • Yêu cầu npm sử dụng thư mục mới này:

npm config set prefix '~/.npm-global'

  
  - **Thêm thư mục mới vào PATH của bạn:** Bước quan trọng này đảm bảo shell của bạn có thể định vị các tệp thực thi mà npm cài đặt toàn cục. Mở tệp cấu hình shell của bạn (`~/.bashrc`, `~/.zshrc`, hoặc `~/.profile` là phổ biến) và chèn dòng sau:
    ```bash
export PATH="~/.npm-global/bin:$PATH"

Sau khi thêm dòng này, hãy lưu tệp. Sau đó, khởi động lại terminal của bạn hoặc áp dụng các thay đổi bằng cách nguồn tệp:

```bash

source ~/.bashrc # Or ~/.zshrc, ~/.profile

  

#### Tùy chọn 2: Khắc phục quyền cho các thư mục hiện có (Sử dụng cẩn trọng)
Có thể bạn thích cài đặt các gói toàn cục ở vị trí hệ thống mặc định, hoặc bạn chỉ đang đối mặt với một vấn đề quyền duy nhất. Trong những trường hợp như vậy, bạn có thể chọn thay đổi quyền sở hữu của các thư mục npm gây ra sự cố. Mặc dù cách tiếp cận này không lý tưởng cho việc quản lý gói toàn cục lâu dài, nhưng nó chắc chắn có thể giải quyết các vấn đề ngay lập tức.

**Cảnh báo:** Hết sức thận trọng khi sử dụng `sudo` và `chown`. Lạm dụng các lệnh này có thể dẫn đến mất ổn định hệ thống.

  - **Xác định các thư mục bị ảnh hưởng:** Bạn thường sẽ cần định vị cả thư mục cài đặt toàn cục của npm và thư mục bộ nhớ cache của npm.
    ```bash
npm config get prefix
npm config get cache

Ví dụ, tiền tố có thể là /usr/local, và bộ nhớ cache có thể là ~/.npm hoặc /Users/YOUR_USER/.npm.

  • Thay đổi quyền sở hữu của các thư mục: Đảm bảo thay thế <NPM_PREFIX_DIR><NPM_CACHE_DIR> bằng các đường dẫn thực tế mà bạn đã tìm thấy ở bước trước. Nếu muốn, bạn có thể nhập tên người dùng của mình thay vì sử dụng $(whoami).

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} sudo chown -R $(whoami) $(npm config get cache)


Để bạn biết, `lib/node_modules`, `bin` và `share` là các thư mục con tiêu chuẩn cho các gói toàn cục và các tệp thực thi của chúng.

  

#### Tùy chọn 3: Khắc phục quyền cụ thể của dự án
Lỗi `EACCES` có xuất hiện trong một thư mục dự án Node.js cụ thể không? Ví dụ, khi bạn đang cố gắng chạy `npm install` hoặc `npm start` cục bộ? Trong những trường hợp như vậy, rất có thể các tệp dự án hoặc thư mục `node_modules` của nó có quyền sở hữu không đúng.

  - **Điều hướng đến thư mục dự án của bạn:**
    ```bash
cd /path/to/your/project
  • Thay đổi quyền sở hữu của thư mục dự án: Lệnh này sẽ đệ quy thay đổi chủ sở hữu của tất cả các tệp và thư mục con bên trong dự án của bạn thành người dùng hiện tại của bạn.

sudo chown -R $(whoami) .


**Quan trọng:** Kiểm tra kỹ xem bạn đang ở trong thư mục dự án chính xác trước khi chạy lệnh này!

  

#### Tùy chọn 4: Xóa bộ nhớ cache của npm
Đôi khi, bộ nhớ cache npm bị hỏng hoặc bị khóa quyền có thể là nguyên nhân gây ra lỗi `EACCES`.

  - **Xóa bộ nhớ cache của npm:**
    ```bash
npm cache clean --force

Lệnh này xóa hoàn toàn tất cả dữ liệu khỏi bộ nhớ cache npm của bạn. Nếu bản thân bộ nhớ cache có vấn đề về quyền, bạn có thể cần kết hợp bước này với việc thay đổi quyền sở hữu thư mục bộ nhớ cache, như được mô tả trong Tùy chọn 2, trước khi xóa nó.

Xác minh

Sau khi bạn đã áp dụng một hoặc nhiều cách khắc phục này, điều cần thiết là phải xác minh rằng vấn đề đã thực sự được giải quyết. Hãy thử lặp lại hành động đã thất bại trước đó.

  • Đối với các vấn đề về gói toàn cục (Tùy chọn 1 hoặc 2): Cố gắng cài đặt một gói toàn cục mới. Một ứng cử viên thử nghiệm tốt là nodemon:

npm install -g nodemon


Nếu `nodemon` cài đặt thành công mà không có lỗi `EACCES` nào, cách khắc phục của bạn đã hoạt động!

  
  - **Đối với các vấn đề cụ thể của dự án (Tùy chọn 3 hoặc 4):** Thử cài đặt các phụ thuộc của dự án hoặc chạy một script dự án.
    ```bash
cd /path/to/your/project
npm install
npm start # Or whatever script was failing

Nếu các lệnh này thực thi trơn tru, không có bất kỳ lỗi quyền nào, quyền của dự án của bạn hiện có thể đã chính xác.

Mẹo để tránh các lỗi EACCES trong tương lai

  • Không bao giờ sử dụng sudo npm install (trừ khi hoàn toàn cần thiết): Chạy các lệnh npm với sudo hầu như luôn là một giải pháp tạm thời. Nó thường tạo ra nhiều vấn đề hơn về sau bằng cách thay đổi quyền sở hữu tệp thành root. Thay vào đó, hãy luôn cấu hình npm đúng cách bằng phương pháp như Tùy chọn 1.
  • Sử dụng Trình quản lý phiên bản Node (NVM) hoặc Volta: Các công cụ như NVM (Node Version Manager) hoặc Volta là những công cụ thay đổi cuộc chơi. Chúng cho phép bạn cài đặt và quản lý nhiều phiên bản Node.js và các gói npm liên quan hoàn toàn trong thư mục chính của người dùng. Điều này hoàn toàn bỏ qua nhu cầu ghi vào các thư mục hệ thống cho các gói toàn cục, loại bỏ hiệu quả các lỗi EACCES cho các cài đặt toàn cục.
  • Lưu ý đến môi trường phát triển dùng chung: Nếu bạn đang cộng tác trong môi trường dùng chung (ví dụ: máy ảo hoặc máy chủ nhóm), hãy luôn đảm bảo tài khoản người dùng của bạn có các quyền thích hợp cho tất cả các thư mục dự án.

Related Error Notes