kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 MrEvil
MrEvil
Вопрос

Определение корня проекта из запущенного приложения node.js

Есть ли лучший способ, чем process.cwd(), определить корневой каталог запущенного процесса node.js? Что-то вроде эквивалента Rails.root, но для Node.js. Я ищу что-то настолько предсказуемое и надежное, насколько это возможно.

284 2012-04-22T06:39:20+00:00 20
Программирование
node.js
Востребованные видео
Docker для Начинающих - Полный Курс [2021]
Docker для Начинающих - Полный Курс [2021]
1 год назад
Node JS - Быстрый Курс за 1 час
Node JS - Быстрый Курс за 1 час
3 года назад
Node JS фундаментальный курс от А до Я. Node.js Теория и практика
Node JS фундаментальный курс от А до Я. Node.js Теория и практика
1 год назад
NodeJS, Express, MongoDB - Сайт с нуля
NodeJS, Express, MongoDB - Сайт с нуля
3 года назад
Создание динамичных сайтов с помощью фреймворка Django
Создание динамичных сайтов с помощью фреймворка Django
3 года назад
Запуск NodeJS приложения на VPS хостинге на примере Telegram бота
Запуск NodeJS приложения на VPS хостинге на примере Telegram бота
5 лет назад
Модульная система Node.js
Модульная система Node.js
4 года назад
Занятие 3. Web приложение и их безопасность
Занятие 3. Web приложение и их безопасность
2 года назад
PiterJS #54 + Node.js SPb
PiterJS #54 + Node.js SPb
2 года назад
Bonch.dev школа 2019: Android разработка. 8 лекция: Service
Bonch.dev школа 2019: Android разработка. 8 лекция: Service
2 года назад
#21 - Node.js 14, TypeScript 3.9 [Классический]
#21 - Node.js 14, TypeScript 3.9 [Классический]
2 года назад
Learn Docker in 7 Easy Steps (перевод)
Learn Docker in 7 Easy Steps (перевод)
2 года назад
Урок 12 - Модуль HTTP
Урок 12 - Модуль HTTP
1 год назад
03. Прикручиваем  pug  и mongoose
03. Прикручиваем pug и mongoose
4 года назад
Загрузка файла на сервер на чистой Node.js ( часть 2)
Загрузка файла на сервер на чистой Node.js ( часть 2)
2 года назад
« Назад
Вперёд »
Этот вопрос имеет 1 ответ на английском, чтобы прочитать их войдите в свой аккаунт.
Решение / Ответ
 inxilpro
inxilpro
10-го сентября 2013 в 2:22
2013-09-10T14:22:58+00:00
Дополнительно
Источник
Редактировать
#16002203

Существует несколько способов решения этой проблемы, каждый из которых имеет свои плюсы и минусы:

require.main.filename

Из http://nodejs.org/api/modules.html:

Когда файл запускается непосредственно из Node, require.main устанавливается на его модуль. Это означает, что вы можете определить, был ли файл запущен напрямую, проверив require.main === module.

Поскольку module предоставляет свойство filename (обычно эквивалентное __filename), точка входа текущего приложения может быть получена путем проверки require.main.filename.

Поэтому, если вам нужен базовый каталог для вашего приложения, вы можете сделать следующее:

var path = require('path');
var appDir = path.dirname(require.main.filename);

Плюсы и минусы

В большинстве случаев этот метод работает отлично, но если вы запускаете свое приложение с помощью пусковой установки типа pm2 или выполняете тесты mocha, этот метод не сработает.

global.X

В Node есть объект глобального пространства имен, называемый global - все, что вы прикрепите к этому объекту, будет доступно везде в вашем приложении. Таким образом, в вашем index.js (или app.js, или как бы ни назывался ваш основной файл приложения), вы можете просто определить глобальную переменную:

// index.js
var path = require('path');
global.appRoot = path.resolve(__dirname);

// lib/moduleA/component1.js
require(appRoot + '/lib/moduleB/component2.js');

Плюсы и минусы

Работает стабильно, но вы должны полагаться на глобальную переменную, что означает, что вы не можете легко повторно использовать компоненты/etc.

process.cwd()

Возвращает текущий рабочий каталог. Совсем не надежно, так как полностью зависит от того, из какого каталога был запущен процесс:

$ cd /home/demo/
$ mkdir subdir
$ echo "console.log(process.cwd());" > subdir/demo.js
$ node subdir/demo.js
/home/demo
$ cd subdir
$ node demo.js
/home/demo/subdir

app-root-path

Чтобы решить эту проблему, я создал модуль node под названием app-root-path. Использовать его очень просто:

var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');

Модуль app-root-path использует несколько различных методов для определения корневого пути приложения, принимая во внимание глобально установленные модули (например, если ваше приложение работает в /var/www/, но модуль установлен в ~/.nvm/v0.x.x/lib/node/). Это не будет работать в 100% случаев, но это будет работать в большинстве распространенных сценариев.

Pros & Cons

Работает без конфигурации в большинстве случаев. Также предоставляет некоторые приятные дополнительные методы удобства (см. страницу проекта). Самым большим недостатком является то, что он не будет работать, если:

  • Вы используете пусковую установку, например pm2.
  • AND, модуль не установлен в директории node_modules вашего приложения (например, если вы установили его глобально)

Вы можете обойти это, установив переменную окружения APP_ROOT_PATH или вызвав .setPath() для модуля, но в этом случае, вероятно, лучше использовать метод global.

переменная окружения NODE_PATH

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

Node's Modules system ищет модули в различных местах. Одним из таких мест является место, куда указывает process.env.NODE_PATH. Если вы установите эту переменную окружения, то сможете требовать модули с помощью стандартного загрузчика модулей без каких-либо других изменений.

Например, если вы установите NODE_PATH в /var/www/lib, то следующее будет работать просто замечательно:

require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js

Отличный способ сделать это - использовать npm:

"scripts": {
    "start": "NODE_PATH=. node app.js"
}

Теперь вы можете запустить ваше приложение с помощью npm start и вы'золотой. Я сочетаю это с модулем enforce-node-path, который предотвращает случайную загрузку приложения без установленного NODE_PATH. Для еще большего контроля над принудительным использованием переменных окружения, смотрите checkenv.

Одна загвоздка: NODE_PATH должен быть установлен вне приложения node. Вы не можете сделать что-то вроде process.env.NODE_PATH = path.resolve(__dirname), потому что загрузчик модулей кэширует список каталогов, которые он будет искать перед запуском вашего приложения.

[добавлено 4/6/16] Другой действительно перспективный модуль, который пытается решить эту проблему - wavy.

 inxilpro
inxilpro
Редактировал ответ 7-го апреля 2016 в 3:46
Modules: CommonJS modules | Node.js v18.9.0 Documentation
nodejs.org
GitHub - kolodny/wavy: use ~ in require and import calls
use ~ in require and import calls. Contribute to kolodny/wavy development by creating an account on GitHub.
github.com
556
0
 izb
izb
7-го июня 2013 в 3:45
2013-06-07T15:45:20+00:00
Дополнительно
Источник
Редактировать
#16002201

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

Если вам нужен корневой каталог запущенного процесса, то, вероятно, вам лучше использовать process.cwd().

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

Вы можете читать переменные окружения в node с помощью чего-то вроде process.env.MY_ENV_VARIABLE.

 pkyeck
pkyeck
Редактировал ответ 30-го марта 2016 в 7:23
50
0
Fareed Alnamrouti
Fareed Alnamrouti
18-го августа 2013 в 11:20
2013-08-18T23:20:04+00:00
Дополнительно
Источник
Редактировать
#16002202

1- создайте файл в корне проекта, назовите его settings.js.

2- внутри этого файла добавьте следующий код

module.exports = {
    POST_MAX_SIZE : 40 , //MB
    UPLOAD_MAX_FILE_SIZE: 40, //MB
    PROJECT_DIR : __dirname
};

3- внутри node_modules создайте новый модуль, назовите его "settings" и внутри модуля index.js напишите этот код:

module.exports = require("../../settings");

4- и в любое время, когда вы захотите открыть каталог проекта, просто используйте

var settings = require("settings");
settings.PROJECT_DIR; 

таким образом у вас будут все директории проекта относительно этого файла ;)

Fareed Alnamrouti
Fareed Alnamrouti
Редактировал ответ 22-го ноября 2013 в 8:36
44
0
Alexander Mills
Alexander Mills
26-го мая 2015 в 6:14
2015-05-26T18:14:14+00:00
Дополнительно
Источник
Редактировать
#16002207

самый простой способ получить глобальный корень (при использовании НПМ для выполнения node.js приложение 'НПМ старт' и т. д.)

var appRoot = process.env.PWD;

Если вы хотите кросс-проверки выше

Скажем, вы хотите проверить процесс.ОКР.Дуо с настройки вы node.js приложения. если вы хотите во время выполнения тестов для проверки правильности процесса.ОКР.Дуо, вы можете проверить его с помощью этого кода (который я написал, кажется, работает хорошо). Вы можете проверить имя последней папки в настройке approot с npm_package_name в свой пакет.JSON-файл, например:

    var path = require('path');

    var globalRoot = __dirname; //(you may have to do some substring processing if the first script you run is not in the project root, since __dirname refers to the directory that the file is in for which __dirname is called in.)

    //compare the last directory in the globalRoot path to the name of the project in your package.json file
    var folders = globalRoot.split(path.sep);
    var packageName = folders[folders.length-1];
    var pwd = process.env.PWD;
    var npmPackageName = process.env.npm_package_name;
    if(packageName !== npmPackageName){
        throw new Error('Failed check for runtime string equality between globalRoot-bottommost directory and npm_package_name.');
    }
    if(globalRoot !== pwd){
        throw new Error('Failed check for runtime string equality between globalRoot and process.env.PWD.');
    }

вы также можете использовать этот модуль НПМ: требуется('приложение-Root-пути'), которая работает очень хорошо для этой цели

Alexander Mills
Alexander Mills
Редактировал ответ 8-го ноября 2015 в 4:39
20
0
 Patrick
Patrick
14-го мая 2017 в 6:08
2017-05-14T06:08:39+00:00
Дополнительно
Источник
Редактировать
#16002214

Я'вэ нашел это работает для меня, даже когда приложение вызывается из суб-папки, как это может быть с некоторыми тестирования, как Мокко:

process.mainModule.paths[0].split('node_modules')[0].slice(0, -1);

Почему это работает:

Во время выполнения узла создает реестре на полные пути всех загруженных файлов. Модули загружаются первыми, а значит в верхней части реестра. Выбрав первый элемент реестра и возвращает путь до 'папки node_modules' каталога мы можем определить корень применение.

Это's просто одна строка кода, но для простоты'ы имя (мое имя), я черный в штучной упаковке его в НПМ модуль:

https://www.npmjs.com/package/node-root.pddivine

Наслаждайтесь!

10
0
 kvz
kvz
19-го июня 2015 в 4:04
2015-06-19T16:04:45+00:00
Дополнительно
Источник
Редактировать
#16002208

Может быть, вы можете попробовать перейти вверх от __имя_файла, пока вы не найдете пакет.формат JSON`, и решили, что'ы главная каталог ваш текущий файл принадлежит.

7
0
Konstantin Isaev
Konstantin Isaev
18-го апреля 2014 в 1:10
2014-04-18T13:10:30+00:00
Дополнительно
Источник
Редактировать
#16002205

Все эти "у корня Дирс" в основном нужно решить какие-то виртуальные пути в реальный путь кучу, так может быть вам стоит посмотреть на пути.решение`?

var path= require('path');
var filePath = path.resolve('our/virtual/path.ext");
Paul DelRe
Paul DelRe
Редактировал ответ 9-го января 2015 в 9:18
7
0
Avi Tshuva
Avi Tshuva
5-го февраля 2017 в 11:17
2017-02-05T11:17:46+00:00
Дополнительно
Источник
Редактировать
#16002213

На самом деле, я считаю, возможно тривиальное решение и самое надежное: вы просто поместите следующий файл в корневом каталоге вашего проекта: root-path.js который содержит следующий код:

import * as path from 'path'
const projectRootPath = path.resolve(__dirname)
export const rootPath = projectRootPath
Ilyas karim
Ilyas karim
Редактировал ответ 12-го ноября 2018 в 7:59
5
0
 didxga
didxga
15-го декабря 2018 в 12:16
2018-12-15T12:16:27+00:00
Дополнительно
Источник
Редактировать
#16002222

Как просто добавить эту строку в ваш модуль в корень, обычно это app.js

global.__basedir = __dirname;

Затем _basedir будет accessiable на все ваши модули.

4
0
Ben Davies
Ben Davies
10-го августа 2015 в 10:51
2015-08-10T10:51:28+00:00
Дополнительно
Источник
Редактировать
#16002209

Метод, который я'вэ нашел полезным при использовании курьерского добавить следующее app.js прежде чем любой из ваших других маршрутах устанавливаются

// set rootPath
app.use(function(req, res, next) {
  req.rootPath = __dirname;
  next();
});

app.use('/myroute', myRoute);

Нет необходимости использовать Globals и у вас есть путь к корневому каталогу как свойство объекта запроса.

Это работает, если ваш app.js находится в корне вашего проекта, который, по умолчанию, это.

3
0
VIKAS KOHLI
VIKAS KOHLI
30-го ноября 2018 в 11:39
2018-11-30T11:39:57+00:00
Дополнительно
Источник
Редактировать
#16002221

Я знаю, что это уже слишком поздно. Но мы можем извлечь URL-адрес корневой папки двумя способами

1-й способ

var path = require('path');
path.dirname(require.main.filename);

2-й способ

var path = require('path');
path.dirname(process.mainModule.filename);

Ссылка:- https://gist.github.com/geekiam/e2e3e0325abd9023d3a3

3
0
 sultan
sultan
12-го января 2018 в 5:50
2018-01-12T17:50:19+00:00
Дополнительно
Источник
Редактировать
#16002215

Сделать это сексуально 💃🏻.<БР/>

const users = require('../../../database/users'); // 👎 what you have
// OR
const users = require('$db/users'); // 👍 no matter how deep you are
const products = require('/database/products'); // 👍 alias or pathing from root directory

<БР/>

Три простых шага, чтобы решить проблему уродливых пути.

  1. Установка пакета: НПМ установить сексуальный-требуется --сохранить<БР/>
  2. Включают требуют('сексуально-требует') - когда-то на верхней части вашего основного файла приложения.

требуют('сексуально-требует'); константный маршрутизаторы = требуют('/маршрутизаторы'); константный АПИ = требуют('$API-интерфейс'); ...

  1. Необязательный шаг. Конфигурации путь может быть определен в `.пути к файлам на корневого каталога Вашего проекта.

$база данных DB = /сервер/ $API-интерфейс-В1 = /сервера/по API/наследие $API-интерфейс-скорость V2 = /сервера/по API/П2

1
0
Dariusz Sikorski
Dariusz Sikorski
28-го мая 2016 в 6:58
2016-05-28T06:58:54+00:00
Дополнительно
Источник
Редактировать
#16002210

В верхней части основной файл добавить:

mainDir = __dirname;

Затем использовать его в любой файл, который вам нужен:

console.log('mainDir ' + mainDir);
  • mainDir определяется глобально, если вы нужны ей только для текущего файла - используйте `__каталог вместо.
  • основной файл обычно находится в корневой папке проекта и называются main.js, index.js, gulpfile.js.
1
0
 vbranden
vbranden
2-го декабря 2016 в 3:08
2016-12-02T15:08:23+00:00
Дополнительно
Источник
Редактировать
#16002212

Я использую это.

Для моего модуля библиотека mymodule

ВАР BASE_DIR = __имя_каталога.заменить(/^(.*\/сборка mymodule)(.*)$/, &#39;$1&#39;)

1
0
Pankaj Shinde
Pankaj Shinde
5-го октября 2018 в 8:11
2018-10-05T08:11:28+00:00
Дополнительно
Источник
Редактировать
#16002219

Добавить это где-то к началу основного файла приложения (напр. app.js):

global.__basedir = __dirname;

Это задает глобальную переменную, которая всегда будет соответствовать вашим приложением'с базы реж. Использовать его как и любую другую переменную:

const yourModule = require(__basedir + '/path/to/module.js');

Простой...

1
0
 Akash
Akash
18-го октября 2019 в 4:25
2019-10-18T04:25:22+00:00
Дополнительно
Источник
Редактировать
#16002226

Существует INIT_CWD имущества на процесс.ОКР`. Это то, что я'м работает в моем проекте.

const {INIT_CWD} = process.env; // process.env.INIT_CWD 
const paths = require(`${INIT_CWD}/config/paths`);

Удачи...

1
0
Pulkit Aggarwal
Pulkit Aggarwal
24-го июня 2018 в 10:15
2018-06-24T10:15:19+00:00
Дополнительно
Источник
Редактировать
#16002217

Вы можете просто добавить корневой каталог в экспресс переменной приложение и получить этот путь от приложения. Для этого добавить приложение.набор('корневой каталог каталог', __каталог); в index.js или app.js файл. И использовать запрос.приложение.вам('корневой каталог каталог')` для получения корневой каталог в коде.

0
0
Vincent Lab
Vincent Lab
11-го ноября 2019 в 4:34
2019-11-11T16:34:17+00:00
Дополнительно
Источник
Редактировать
#16002227

если вы хотите определить корень проекта от запущенного приложения Node.js вы можете просто слишком. процесс.mainModule.путь

0
0
Rafi Henig
Rafi Henig
1-го октября 2019 в 9:13
2019-10-01T21:13:47+00:00
Дополнительно
Источник
Редактировать
#16002225

Это будет делать:

path.join(...process.argv[1].split(/\/|\\/).slice(0, -1))
0
0
Andre Figueiredo
Andre Figueiredo
18-го марта 2018 в 12:59
2018-03-18T00:59:04+00:00
Дополнительно
Источник
Редактировать
#16002216
process.mainModule.paths
  .filter(p => !p.includes('node_modules'))
  .shift()

Вам все пути в основные модули и отфильтровать тех, с "папки node_modules" и, тогда вам первый из оставшегося списка путей. Неожиданное поведение не выдает ошибку, просто "неопределенным".

Работает хорошо для меня, даже при вызове, т. е. $ мокко.

0
0
Похожие сообщества 2
Node.js — русскоговорящее сообщество
Node.js — русскоговорящее сообщество
10 113 пользователей
Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было комфортным. Правила: https://rudevs.network/ByaMH6un7 См. также: @js_ru, @react_js, @angular_ru, @vuejs_ru, @devops_ru Вакансии и поиск работы: @javascript_jobs и @nodejs_jobs
Открыть telegram
Node.js Jobs. Stop the war!
Node.js Jobs. Stop the war!
6 856 пользователей
Публикуем вакансии и запросы на поиск работы для разработчиков на Node.js (back-end). Правила оформления вакансий и остальная информация в закрепленном сообщении https://t.me/nodejs_jobs/71106
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
DE
ES
FR
ID
JA
KO
NL
PT
RO
RU
TR
ZH
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией