Cài đặt toàn cầu NPM không thể tìm thấy mô-đun


206

Tôi đã viết một mô-đun mà tôi đã xuất bản đến npm một lúc trước (https://npmjs.org/package/wisp)

Vì vậy, nó cài đặt tốt từ dòng lệnh:

$ npm i -g wisp

Tuy nhiên, khi tôi chạy nó từ dòng lệnh, tôi liên tục gặp lỗi mà trình lạc quan không được cài đặt:

$ wisp 
Error: Cannot find module 'optimist'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:12:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:96:4)
    at Module._compile (module.js:449:26)
    at Object.exports.run (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:68:25)
    at compileScript (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:135:29)
    at fs.stat.notSources.(anonymous function) (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:110:18)

Tuy nhiên, tôi đã chỉ định trong pack.json là phần phụ thuộc:

{
  "name": "wisp",
  "author": "Brendan Scarvell <bscarvell@gmail.com>",
  "version": "0.1.0",
  "description": "Global nodejs file server",
  "dependencies": {
    "optimist": "~0.3.4"
  },
  "repository": "git://github.com/tehlulz/wisp",
  "bin": {
    "wisp" : "./wisp"
  }
}

Có ai biết phải làm gì để có được điều này chạy? Tôi biết nó phải làm gì với phần bin thêm tệp thực thi vào bin và node_modules trong thư mục đó trống. Không biết làm thế nào để giải quyết điều này.


Điều gì xảy ra nếu bạn cài đặt mà không có tùy chọn -g?
vinayr

Nó cài đặt một thư mục node_modules trong thư mục hiện tại có bên trong đó.
Menztrual

Tôi biết. Bạn vẫn nhận được lỗi?
vinayr

Vâng. Nếu tôi cố chạy wisp sau khi thực hiện một npm cục bộ, tôi vẫn trả về lỗi tương tự
Menztrual

Tôi vừa cài đặt mô-đun của bạn. Nó làm việc tốt với tôi. Bạn đang ở đâu? Trong trường hợp của tôi, tôi chạy ./node_modules/wisp/wispmà hoạt động tốt.
vinayr

Câu trả lời:


369

Đối với bất kỳ ai khác gặp phải vấn đề này, tôi gặp phải sự cố này do npmcài đặt vào một vị trí không thuộc về tôi NODE_PATH.

[root@uberneek ~]# which npm
/opt/bin/npm
[root@uberneek ~]# which node
/opt/bin/node
[root@uberneek ~]# echo $NODE_PATH

NODE_PATH của tôi trống và chạy npm install --global --verbose promised-iocho thấy nó đã được cài đặt vào /opt/lib/node_modules/promised-io:

[root@uberneek ~]# npm install --global --verbose promised-io
npm info it worked if it ends with ok
npm verb cli [ '/opt/bin/node',
npm verb cli   '/opt/bin/npm',
npm verb cli   'install',
npm verb cli   '--global',
npm verb cli   '--verbose',
npm verb cli   'promised-io' ]
npm info using npm@1.1.45
npm info using node@v0.8.4
[cut]
npm info build /opt/lib/node_modules/promised-io
npm verb from cache /opt/lib/node_modules/promised-io/package.json
npm verb linkStuff [ true, '/opt/lib/node_modules', true, '/opt/lib/node_modules' ]
[cut]

Kịch bản của tôi thất bại về require('promised-io/promise'):

[neek@uberneek project]$ node buildscripts/stringsmerge.js 

module.js:340
    throw err;
          ^
Error: Cannot find module 'promised-io/promise'
    at Function.Module._resolveFilename (module.js:338:15)

Tôi có thể đã cài đặt nút và npm từ nguồn bằng cách sử dụng configure --prefix=/opt. Tôi không biết tại sao điều này khiến chúng không có khả năng tìm thấy các mô-đun đã cài đặt. Cách khắc phục hiện tại là trỏ NODE_PATH vào thư mục bên phải:

export NODE_PATH=/opt/lib/node_modules

require('promised-io/promise')Bây giờ tôi thành công.


10
nơi để đặt NODE_PATH này ở đâu ??
cát

8
@sandy nơi bạn đặt biến môi trường NODE_PATH tùy thuộc vào hệ điều hành của bạn. Tôi đang sử dụng hương vị của Linux, vì vậy tôi thường export NODE_PATH=...đặt nó trong trình bao cục bộ sao cho nó được xuất sang các lệnh chạy trong trình bao đó. Để thực hiện thay đổi liên tục hoặc có sẵn cho tất cả các hệ vỏ, hãy đặt nó vào .profile hoặc tương tự. Toàn bộ khái niệm này rất phức tạp đối với người mới, hãy thử đọc help.ubfox.com/community/En MôiVariables . Đối với Windows, bạn sẽ muốn chuyển sang Linux. OK, đùa thôi. Hãy dùng thử computerhope.com/issues/ch000549.htm hoặc google nó.
Neek

13
Đối với OSX Lion, sau đây đã làm việc cho tôi ... xuất NODE_PATH = / usr / local / lib / node_modules Tôi đã sử dụng 'xác định vị trí node_modules' để theo dõi đường dẫn bên phải.
k1eran

2
NODE_PATH cũng hoạt động cho WINDOWS. điều này được bắt nguồn từ các mô-đun nút có thể được cài đặt cả cục bộ và toàn cầu.
nhấp nháy

5
Nếu bạn đã cài đặt Node.js với Homebrew trên Mac OS X: Chạy open -a TextEdit ~/.bash_profiletrong Terminal, sau đó thêm export NODE_PATH=/usr/local/lib/node_modulesvào cuối tệp. Khởi động lại cửa sổ terminal. Bây giờ đang chạy echo $NODE_PATHnên in ra /usr/local/lib/node_modules.
Pwdr

39

thêm phần này vào đầu prog (mac):

module.paths.push('/usr/local/lib/node_modules');


4
Bất kỳ cách nào để làm điều đó một cách cụ thể không os?
UpTheCux

@UpTheCalet đây một cách cụ thể không os. Đó là mã JS, bạn chỉ cần trỏ đến một nút_modules có moduleyou đang tìm kiếm
Adelin

@Adelin - Đây là một giải pháp dành riêng cho hệ điều hành vì vị trí của node_modules toàn cầu là dành riêng cho hệ điều hành. Ví dụ: nếu bạn đang phát triển trên windows và chạy linux trong sản xuất, thì đây không phải là một giải pháp tuyệt vời.
UpTheCux

Điều đó dễ dàng vượt qua. Ví dụ, bạn có thể lưu đường dẫn nút trong một biến env, ví dụ, và thay thế đường dẫn được mã hóa cứng bằng os.environ.nodepath(một cái gì đó dọc theo các dòng này).
Adelin

macOS Mojave 10.14.6 yêu cầu thêm xuất NODE_PATH = / usr / local / lib / node_modules / npm / node_modules vào ~ / bash_profile, độc lập hơn với máy.
vwvan

16

Theo mặc định, nút không nhìn vào bên trong / usr / local / lib / node_module để tải các mô-đun toàn cầu. Tham khảo tải mô-đun được giải thích trong http://nodejs.org/api/modules.html#modules_loading_from_the_global_ Folders

Vì vậy, bạn phải 1) thêm / usr / local / lib / node_module vào NODE_PATH và xuất nó hoặc 2) sao chép các mô-đun nút đã cài đặt vào / usr / local / lib / nút. (Như được giải thích trong liên kết để tải nút mô-đun sẽ tìm kiếm trong đường dẫn này và sẽ hoạt động)


10

Đối với một số người (như tôi) không có gì khác làm việc, hãy thử điều này:

brew cleanup
brew link node
brew uninstall node
brew install node

Hy vọng nó sẽ giúp được ai đó :)


9

Các sửa chữa chung sau đây sẽ cho bất kỳ mô-đun. Ví dụ với request-promise.

Thay thế

npm install request-promise --global

Với

npm install request-promise --cli

làm việc ( nguồn ) và cũng cho globalsinherits

Ngoài ra, hãy thử thiết lập biến môi trường

NODE_PATH=%AppData%\npm\node_modules


3

$ vim /etc/profile.d/nodejs.sh

NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
export NODE_PATH="$NODE_PATH"

Đó là mặc định. Đối với người dùng, nó đã được tải, nhưng trong khi chạy bằng root thì không, do đó cần phải được đưa vào đường dẫn của người dùng root.
stamster

2

Đối với Windows, từ Nodejs không thể tìm thấy mô-đun cài đặt trên Windows? những gì làm việc cho tôi là chạy liên kết npm như trong

npm link wisp

Mặc dù vậy, một lời cảnh báo - tôi đã làm điều này nhưng sau đó không thể sử dụng mã được nén với AWS lambda. Tôi phải có node_module được tạo cục bộ như trong npm install wisp --save(không có tùy chọn -g)
PM

2

Đối với người dùng Mac, tốt nhất nên sử dụng cài đặt thủ công:

Để giảm thiểu khả năng xảy ra lỗi quyền, bạn có thể định cấu hình npm để sử dụng một thư mục khác. Trong ví dụ này, nó sẽ là một thư mục ẩn trong thư mục nhà của bạn.

  1. Sao lưu máy tính của bạn trước khi bạn bắt đầu.

  2. Tạo một thư mục để cài đặt toàn cầu:

    mkdir ~ / .npm-toàn cầu

  3. Cấu hình npm để sử dụng đường dẫn thư mục mới:

    cấu hình npm đặt tiền tố '~ / .npm-global'

  4. Mở hoặc tạo tệp ~ / .profile và thêm dòng này:

    xuất PATH = ~ / .npm-global / bin: $ PATH

  5. Quay lại dòng lệnh, cập nhật các biến hệ thống của bạn:

    nguồn ~ / .profile

  6. Kiểm tra: Tải xuống một gói trên toàn cầu mà không cần sử dụng sudo.

    cài đặt npm -g jshint

Thay vì các bước 2-4, bạn có thể sử dụng biến ENV tương ứng (ví dụ: nếu bạn không muốn sửa đổi ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global

Tham khảo: https://docs.npmjs.com/getting-started/fixing-npm-permissions


1

Có cùng một vấn đề trên một trong những máy chủ thử nghiệm chạy Ubuntudưới root. Sau đó, tạo một người dùng mới sử dụng useradd -m myusertất cả mọi thứ được cài đặt ( nvm, node, bao bì) như myuser. Bây giờ nó hoạt động tốt.


1

Trên cửa sổ nếu bạn vừa cài đặt sạch và bạn nhận được điều này, bạn cần xóa bộ nhớ cache npm của mình trong \ AppData \ Roaming


1

Trong trường hợp của tôi cả hai nodenpmđều trong cùng một đường dẫn ( /usr/bin). Cái NODE_PATHnày trống rỗng, vì vậy các npmmô-đun toàn cầu đã đặt vào /usr/lib/node_modulesnơi require(...)tìm thấy chúng thành công. Ngoại lệ duy nhất là npmmô-đun, đi kèm với gói nodejs. Vì tôi đang sử dụng hệ thống 64 bit, nó đã được đặt vào /usr/lib64/node_modules. Đây không phải là nơi yêu cầu (...) tìm kiếm trong trường hợp trống NODE_PATHvà nút bắt đầu từ đó /usr/bin. Vì vậy, tôi có hai lựa chọn:

  • liên kết /usr/lib64/node_modules/npmđến/usr/lib/node_modules/npm
  • di chuyển các mô-đun từ /usr/lib/node_modules/*đến /usr/lib64/node_modules/và thiết lậpNODE_PATH=/usr/lib64/node_modules

Cả hai đều làm việc. Tôi đang sử dụng OpenSUSE 42.1 và gói nodejs từ kho cập nhật. Phiên bản là 4.4.5.


1

Tôi đã làm điều này theo cách đơn giản ...

  1. Hủy cài đặt nút từ bảng điều khiển [Windows 7]
  2. Cài đặt lại nút
  3. Cài đặt thước đo npm install --global --verbose protractor
    Cập nhật trình quản lý trình điều khiển web.

làm việc tốt cho tôi

Hy vọng điều này sẽ giúp bạn ....


1

Tôi đã gặp lỗi này Error: Cannot find module 'number-is-nan' trong khi các mô-đun thực sự tồn tại. Đó là do cài đặt Node.js xấu / không đầy đủ.

Đối với Windows, như các câu trả lời khác gợi ý, bạn cần cài đặt Node sạch :

  • Gỡ cài đặt Node.js
  • Xóa hai thư mục npmnpm_cache trongC:\Users\user\AppData\Roaming
  • Khởi động lại Windows và cài đặt Node.js
  • Chạy npm inithoặc ( npm init --yescho cấu hình mặc định )
  • Đặt biến môi trường Windows cho NODE_PATH. Đường dẫn này là nơi các gói của bạn được cài đặt. Có lẽ nó giống nhưNODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules
  • Bắt đầu một giao diện điều khiển cmd mới và npmsẽ hoạt động tốt

Ghi chú :

Hãy thử các điểm cuối cùng trước khi cài đặt lại Node.js, việc này có thể giúp bạn tiết kiệm thời gian và tránh cài đặt lại tất cả các gói của bạn.


1

Tôi vừa gặp vấn đề này của các axiosmô-đun. Sau đó, tôi đã thử điều này: chạy rm -rf node_modulesyarn. Và nó hoạt động.


0

Tôi đã có lỗi tương tự như OP, nhưng đào sâu vào nhật ký tôi có thể thấy sh: node: command not found.

Nó chỉ ra rằng chương trình / usr / bin / nút (symlink) không còn được cài đặt với apt install nodejs. Khi /usr/bin/node' tonodejs được liên kết với nhau, npm được liên kết cài đặt -g @ angular / cli` đã thành công.

Cách thích hợp để cài đặt này trên debian là apt install nodejs-legacy.


0

Tôi đã phải thêm C: \ Users \ {Tên người dùng} \ AppData \ Roaming \ npm vào các biến env của tôi và sau đó tôi có thể cài đặt công cụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.