ฉันจะอิมพอร์ตโมดูลโกลบอลในโหนดได้อย่างไร ฉันได้รับ“ ข้อผิดพลาด: ไม่พบโมดูล <module>”?


145

ฉันกำลังพยายามติดตั้ง Node บน Mac OSX Lion ดูเหมือนว่าจะใช้ได้ทั้งหมด แต่ฉันไม่สามารถนำเข้าโมดูลใด ๆ จากโฟลเดอร์โมดูลส่วนกลางของฉันได้ ฉันได้รับข้อผิดพลาด

Error: Cannot find module <module>

หากฉันใช้สิ่งนี้: node -e require.pathsการตอบสนองที่ฉันได้รับคือ:

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

ซึ่งถูกต้องโมดูลของฉันถูกติดตั้งแน่นอนใน / usr / local / lib / node_modules อย่างไรก็ตามเมื่อฉันพยายามเรียกใช้สคริปต์ฉันได้รับสิ่งนี้:

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

.bash_profile ของฉันมีลักษณะเช่นนี้:

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

จะขอบคุณความช่วยเหลือบางอย่างฉันไม่รู้ว่าทำไมฉันไม่สามารถนำเข้าห้องสมุดใด ๆ


1
คุณรู้ไหมว่านี่ไม่ใช่วิธีที่ต้องการในการทำสิ่งต่าง ๆ ใช่ไหม?
thejh

1
คุณสามารถทำอย่างละเอียด? คุณหมายถึงฉันไม่ควรติดตั้งไลบรารีไปยังโฟลเดอร์ทั่วโลกของฉันหรือไม่?
Hanpan

3
@Hanpan: วิธีที่ต้องการคือการติดตั้งโมดูลที่คุณต้องการใช้ผ่าน require () ในเครื่อง
thejh

1
คำตอบที่ดีขึ้นและปรับปรุงมากขึ้น (ที่ไม่พึ่งพาnpm link) สามารถพบได้ที่นี่: stackoverflow.com/a/15646750/2671392
GGG

1
ฉันเป็นโรงเรียนเก่าและคุ้นเคยกับการติดตั้งห้องสมุดในที่ตั้งทั่วโลก ฉันไม่เคยเห็นเหตุผลที่น่าเชื่อถือใด ๆ สำหรับการใช้งานการติดตั้งห้องสมุดท้องถิ่นอย่างหนัก ชั้นเรียน mongodb ที่ฉันลงไปจะจบลงที่ใดที่หนึ่งใกล้กับโครงการขนาดเล็กกว่าร้อยโครงการตามเวลาที่เราทำเสร็จแต่ละคนมีห้องสมุดที่ซ้ำกันส่วนใหญ่ - mongodb, express, รวมเข้าด้วยกันและอื่น ๆ ของห้องสมุดท้องถิ่นทุกที่ ฉันต้องมี Scala libs นับพันในที่เก็บสกาล่าท้องถิ่น Ditto Meteor, groovy และ ruby
Stephen W. Wright

คำตอบ:


116

หากคุณใช้ npm> = 1.0 คุณสามารถใช้npm link <global-package>เพื่อสร้างลิงก์ท้องถิ่นไปยังแพ็คเกจที่ติดตั้งแล้วทั่วโลก ( Caveat: ระบบปฏิบัติการจะต้องสนับสนุน symlink )

อย่างไรก็ตามสิ่งนี้ไม่ได้มาโดยไม่มีปัญหา

ลิงค์ NPM เป็นเครื่องมือในการพัฒนา มันเป็นเรื่องที่น่ากลัวสำหรับการจัดการแพคเกจกล่องการพัฒนาท้องถิ่นของคุณ แต่การปรับใช้กับลิงก์ npm นั้นโดยทั่วไปแล้วจะถามถึงปัญหาเนื่องจากมันทำให้การอัปเดตสิ่งต่าง ๆ เป็นเรื่องง่ายโดยไม่ทราบ

คุณสามารถติดตั้งแพ็คเกจได้ทั้งในประเทศและทั่วโลก

สำหรับข้อมูลเพิ่มเติมโปรดดู


69
ฉันกำลังอ่านสิ่งนี้อยู่และไม่สามารถเชื่อสายตาของฉันได้ ดังนั้นถ้าฉันติดตั้งพูดด่วนแล้วมี 20 โปรเจคที่จะสร้างบนเอ็กซ์เพรสฉันต้องติดตั้ง 20 ครั้งสำหรับแต่ละโครงการในโฟลเดอร์โปรเจ็กต์ทุกครั้งหรือไม่ ฉันไม่ค่อยมีประสบการณ์กับผู้จัดการแพ็คเกจ แต่อันนี้แย่มาก ...
treznik

25
ถูกต้องและถ้าคุณคิดเกี่ยวกับมันมันทำให้รู้สึก การจัดการการพึ่งพาของคุณในพื้นที่ทำให้ทุกอย่างอยู่ในตัวเองและช่วยให้คุณสามารถระบุรุ่นที่เฉพาะเจาะจงของการพึ่งพาสำหรับโครงการที่กำหนดใด ๆ (เช่นโครงการ foo ต้องการ express 2.x ในขณะที่แถบโครงการสามารถใช้ express 3 beta)
grahamb

43
ฉันพยายามที่จะเข้าใจตรรกะนี้ในขณะที่เช่นกัน แต่หลังจากที่ดูทับทิมเพื่อนต่อสู้ของฉันกับแพคเกจระดับโลกเกี่ยวกับการโต้แย้ง gemsets และบ่อยครั้งก็ไม่เคยอัพเกรดผมได้ยอมรับว่าการติดตั้งการอ้างอิงในท้องถิ่นเป็นอย่างวิธีเดียวที่มีเหตุผลที่จะทำ การจัดการแพคเกจ
Timoxley

3
ฉันต้องการวาดเส้นขนานระหว่างสถานการณ์นี้และของการเชื่อมโยงแบบคงที่เทียบกับการเชื่อมโยงแบบไดนามิกห้องสมุดที่เกี่ยวข้องกับการกระจายของซอฟต์แวร์ พิจารณาว่าแอพเกือบทั้งหมดกระจายอยู่ใน iOS App Store ต้องเชื่อมโยงการพึ่งพาแบบคงที่ซึ่ง iOS SDK ไม่ได้ให้ไว้ ทำไมถึงทำเช่นนี้? นรกพึ่งพาโลกเป็นเรื่องจริงมาก
Steven Lu

1
นอกจากนี้ยังเป็นความเข้าใจของฉันว่าnpmแคช (ซึ่งมีชีวิตอยู่~/.npm) จะทำให้กระบวนการติดตั้งใหม่ดำเนินการได้อย่างสะดวกในสถานที่ต่าง ๆ ของคุณ
Steven Lu

85

Node.js ใช้ตัวแปรสภาวะแวดล้อมNODE_PATHเพื่ออนุญาตให้ระบุไดเร็กทอรีเพิ่มเติมเพื่อรวมในพา ธ การค้นหาโมดูล คุณสามารถใช้npmตัวเองเพื่อบอกคุณว่าโมดูลสากลถูกเก็บไว้ด้วยnpm root -gคำสั่ง ดังนั้นเมื่อรวมสองสิ่งนี้เข้าด้วยกันคุณสามารถทำให้แน่ใจว่าโมดูลทั่วโลกรวมอยู่ในพา ธ การค้นหาของคุณด้วยคำสั่งต่อไปนี้ (บน Linux-ish)

export NODE_PATH=$(npm root --quiet -g)


3
ขอบคุณสำหรับNODE_PATHคำใบ้ตัวแปรสภาพแวดล้อม นั่นช่วยได้มาก!
rekire

7
นี่ควรเป็นความคิดเห็นยอดนิยม
Adam Prax

ฉันต้องตั้งค่าNODE_PATHให้เป็นเส้นทาง posix ที่เทียบเท่าเพื่อให้สามารถใช้งาน MSM2 ได้ในเวลากลางคืน ขอบคุณ.
Joyce Babu

ทำงานร่วมกับ Windows และ Git ได้เช่นกัน สมบูรณ์ :-)
inf3rno

สิ่งนี้ทำให้.node_modulesโฟลเดอร์ของคุณสามารถค้นหาได้ แต่เพื่อที่จะนำเข้าโมดูลโดยใช้require()มันควรจะยังคงติดตั้งในไดเรกทอรีโครงการท้องถิ่นของคุณ (หรืออีกวิธีหนึ่งคือใช้การเชื่อมโยงnpm link) โมดูลส่วนกลางไม่สามารถนำเข้าในโครงการได้มีเพียงไบนารี / สคริปต์เท่านั้นที่สามารถเรียกใช้ได้จากที่นั่น
Prahlad Yeri

65

คุณสามารถใช้ลิงก์ npm เพื่อสร้างลิงก์สัญลักษณ์ไปยังแพ็กเกจโกลบอลของคุณในโฟลเดอร์โปรเจ็กต์ของคุณ

ตัวอย่าง:

$ npm install -g express
$ cd [local path]/project
$ npm link express

สิ่งที่มันทำคือสร้างโฟลเดอร์ node_modules ในเครื่องจากนั้นสร้าง symlink express -> [global directory] / node_modules / express ซึ่งสามารถแก้ไขได้โดย require('express')


Cross-OS นี้ใช้งานร่วมกันได้หรือไม่?
UpTheCreek

Windows รุ่นใหม่กว่ารองรับตั้งแต่รุ่นนี้: github.com/npm/npm/commit/ ......
Alex

22

ติดตั้งแพคเกจใดก็ได้ทั่วโลกดังต่อไปนี้:

$ npm install -g replace  // replace is one of the node module.

เนื่องจากโมดูลการแทนที่นี้ถูกติดตั้งแบบโกลบอลดังนั้นหากคุณเห็นโฟลเดอร์โหนดโมดูลของคุณคุณจะไม่เห็นโมดูลการแทนที่ที่นั่นและคุณไม่สามารถใช้แพ็กเกจนี้โดยใช้ require ('replace')

เพราะด้วยต้องการคุณสามารถใช้เฉพาะโมดูลท้องถิ่นซึ่งมีอยู่ในโฟลเดอร์โมดูลโหนดของคุณ

ตอนนี้เพื่อใช้โมดูลส่วนกลางคุณควรเชื่อมโยงกับโมดูลโหนดพา ธ โดยใช้คำสั่งด้านล่าง

$ npm link replace

ตอนนี้ย้อนกลับไปและดูโฟลเดอร์โหนดโมดูลของคุณคุณสามารถดูโมดูลแทนที่ที่นั่นและสามารถใช้กับมันต้องการ ('แทนที่') ในแอปพลิเคชันของคุณในขณะที่มันเชื่อมโยงกับโมดูลโหนดท้องถิ่นของคุณ

กรุณาแจ้งให้เราทราบหากต้องการการชี้แจงเพิ่มเติมใด ๆ


14

คุณสามารถใช้ require กับพา ธ ไปยังไดเรกทอรีโมดูลส่วนกลางเป็นอาร์กิวเมนต์

require('/path/to/global/node_modules/the_module');

ใน mac ของฉันฉันใช้สิ่งนี้:

require('/usr/local/lib/node_modules/the_module');

วิธีค้นหาโมดูลส่วนกลางของคุณอยู่ที่ไหน? -> แพคเกจติดตั้ง npm อยู่ที่ไหน


7

การตั้งค่าตัวแปรสภาพแวดล้อม NODE_PATH ให้ชี้ไปที่node_modulesโฟลเดอร์ส่วนกลางของคุณ

ใน Windows 7 หรือสูงกว่าพา ธ เป็นสิ่งที่คล้ายกัน%AppData%\npm\node_modulesในขณะที่ UNIX อาจเป็นอะไร/home/sg/.npm_global/lib/node_modules/ก็ได้ แต่ขึ้นอยู่กับการกำหนดค่าของผู้ใช้

คำสั่งnpm config get prefixสามารถช่วยในการค้นหาเส้นทางที่ถูกต้อง

ในระบบ UNIX คุณสามารถทำได้ด้วยคำสั่งต่อไปนี้:

export NODE_PATH=`npm config get prefix`/lib/node_modules/

0

ฉันกำลังใช้ Docker ฉันกำลังพยายามสร้างอิมเมจ docker ที่มีการติดตั้งโหนดทั้งหมดของฉัน แต่สามารถใช้ไดเรกทอรีแอพท้องถิ่นของฉันที่เวลาทำงานของคอนเทนเนอร์ (โดยไม่สร้างมลพิษให้กับไดเร็กทอรีหรือลิงก์ node_modules) สิ่งนี้ทำให้เกิดปัญหาในสถานการณ์นี้ วิธีแก้ปัญหาของฉันคือต้องการจากเส้นทางที่แน่นอนที่โมดูลเช่นต้องการ ('/ usr / local / lib / node_modules / socket.io')


-1

require.paths เลิกใช้แล้ว

ไปที่โฟลเดอร์โครงการของคุณและพิมพ์

npm install socket.io

ที่ควรติดตั้งในโฟลเดอร์. / local_modules ที่โหนดจะค้นหา

ฉันเก็บสิ่งที่ฉันชอบ:

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

สร้างไฟล์ app.js

// app.js
var socket = require('socket.io')

ตอนนี้เรียกใช้แอพของฉัน

node app.js

ให้แน่ใจว่าคุณกำลังใช้และnpm >= 1.0node >= 4.0


8
เขาถามถึงการใช้แพคเกจ npm ที่ติดตั้งทั่วโลก
UpTheCreek

@Jamund คุณกำลังแสดงวิธีใช้แพ็คเกจที่ติดตั้งภายในเครื่อง แต่คำถามเดิมเกี่ยวกับแพคเกจทั่วโลก
Vitaliy Markitanov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.