2013-11-01 2 views
2

У меня есть небольшой скрипт, узел с именем /tmp/test.js, содержащий это:Узел node.js не работает в скрипте?

console.log(require("w3cjs")); 

Если я делаю это из командной строки:

nvm use v0.10.21 
node /tmp/test.js 

я получаю этот выход:

module.js:340 
    throw err; 
    ^
Error: Cannot find module 'w3cjs' 
    at Function.Module._resolveFilename (module.js:338:15) 
    at Function.Module._load (module.js:280:25) 
    at Module.require (module.js:364:17) 
    at require (module.js:380:17) 
    at Object.<anonymous> (/tmp/test.js:1:75) 
    at Module._compile (module.js:456:26) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Function.Module.runMain (module.js:497:10) 

Но если Я делаю это:

node -e $(cat /tmp/test.js) 

я получаю этот выход:

{ validate: [Function: validate], 
    setW3cCheckUrl: [Function: setW3cCheckUrl], 
    w3cjs: [Circular] } 

(другими словами - это работает.)

Почему разница и как сделать работу сценария?

+0

Я думаю, что этот узел не любит быть/tmp-ed –

+2

Ваш 'w3cjs' модуль, вероятно, локально установлен в определенный каталог. Узел использует локальные модули, установленные в каталоге исполняемого файла. Когда вы используете '-e', Node использует локальные модули, установленные в вашем текущем каталоге. – apsillers

+0

@ capsillers - Если бы вы сделали ответ, я бы проголосовал за него. –

ответ

8

При запуске скрипта в другом каталоге Node ищет локальные модули в папке node_modules каталога этого скрипта.

Предположим, что рабочий каталог вашей оболочки в настоящее время /projects/foo. Когда вы запускаете node /tmp/test.js, Node ищет модули в /tmp/node_modules, а не в /projects/foo/node_modules.

Однако, если вы не запустите файл сценария, но запустите некоторый текст в командной строке с помощью -e, Node проверит локальную папку модуля в текущем рабочем каталоге вашей оболочки, то есть /projects/foo/node_modules.

похоже, что у вас есть w3cjs, указанный в вашем рабочем каталоге, но не на /tmp. Вы должны либо установить его там, либо install the module globally with npm's -g option.

Смежные вопросы