Intereting Posts
npm устанавливает все модули в / usr / local / lib / node_modules / Как указать порядок, в котором вычисляются функции node.js? Node.js & Crypto: сохранить текущее состояние экземпляра crypto.createHash, чтобы повторно использовать его позже. Героку (Cedar) + Node + Express + Jade Клиентские файлы javascript в подкаталоге работают локально с мастером + curl, но не при нажатии на Heroku Подавать угловое универсальное приложение с поддержкой NodeJS / ExpressJS Бот-платформа Node.js ad hoc-сообщение К КОНКРЕТНОМУ ПОЛЬЗОВАТЕЛЮ Как установить путь узла для nodejs (Ubuntu) Запрос Neo4j для кратчайшего пути застрял (не работает), если у меня есть отношения 2way в узлах и узлах графика взаимосвязаны Установщик node.js не работает с ошибкой CAQuietExec Failed и 1603 на Windows 7 NPM предупреждает «Нет поля репозитория», но у меня нет репозитория Express.js: данные POST как KEY объекта req.body вместо VALUE req.body? Передача данных socket.io в vuejs Экспресс: доступ к настройкам app.set () в маршрутах Каков наилучший способ передать общие переменные в отдельные модули в Node.js? Восстановить идентификатор Facebook от имени пользователя

Определение местоположения модhive узла во время выполнения

Я создаю инструмент, который в основном является модулем node.js. Этот инструмент можно установить глобально (с опцией -g ). У меня есть несколько статических файлов в модуле для создания отчета. Если модуль вызывается локально, я могу ссылаться на статические файлы с относительным путем ./node_modules//static/filename . Но когда инструмент вызывается как команда, как я могу ссылаться на статические файлы? И как я могу определить, вызван ли инструмент как локальный модуль или как команда?

Используйте магическую переменную __dirname. Он ссылается на каталог, содержащий ваш файл сценария.

http://nodejs.org/api/globals.html#globals_dirname

Когда ваш инструмент установлен глобально, в системах Unix обычно есть две записи:

  • /usr/local/lib/node_modules// -> каталог, содержащий все исходные файлы модуля
  • /usr/local/bin/ -> символическая ссылка на исполняемый скрипт модуля

Поскольку Node использует реальный путь (т. Е. После устранения всех символических ссылок) для разрешения пути относительно текущего модуля, вам не нужно беспокоиться о различиях между глобальной и локальной установкой.

То, что вам нужно обработать, – это, возможно, другой текущий рабочий каталог, в котором выполняется процесс узла. Решение состоит в том, чтобы разрешить относительный путь к вашему статическому файлу против абсолютного пути, где находится ваш модуль, а не предполагать, что процесс узла будет выполняться в определенном каталоге, как в вашем примере.

Для этого есть два способа:

  1. Используя __dirname ( API docs ), который содержит имя каталога (путь) текущего исходного файла:

     var path = require('path'); // assuming this script is in package root directory var staticFile = path.resolve(__dirname, 'static', 'filename'); // if the script is in lib/ subdirectory, then you want to call var staticFile = path.resolve(__dirname, '..', 'static', 'filename'); 
  2. Используя require.resolve() , который возвращает то же имя файла, которое будет использоваться вызовом require() :

     // assuming this script is in package root directory var staticFile = require.resolve('./static/filename'); // if the script is in lib/ subdirectory, then you want to call var staticFile = require.resolve('../static/filename');