Node требуется абсолютный путь

У меня есть каталог, который выглядит так:

-- app/
   |- models/
      |- user.js
   |- config.json

Я хочу, чтобы мой файл user.js требовал config.json. Сейчас я использую require('/config'), но это не работает. Что я делаю не так? Я бы хотел избежать использования require('../config').

Ответы

Ответ 1

Ответ прост: вы не делаете ничего плохого. Согласно небольшому исследованию, функция require ищет одно из:

  • основной модуль, такой как фс
  • относительный путь к файлу, который вы указываете в вызове require
  • поиск в каталоге для модуля с соответствующим именем в папке node_modules где-то в родительском каталоге файла, в котором вызывается функция require.

См.: http://www.bennadel.com/blog/2169-Where-Does-Node-js-And-Require-Look-For-Modules-.htm И: http://nodejs.org/api/modules. HTML # loading_from_node_modules_Folders

Оба вышеупомянутых ресурса ссылаются на возможность также изменять переменную среды NODE_PATH, однако это звучит как очень плохая практика и, как минимум, сделает ваш код менее переносимым. Это также, вероятно, даже не сработало бы для файла, подобного config.json, поскольку, хотя я никогда этого не делал, я представлял, что изменение переменной NODE_PATH изменяется только тогда, когда require() ищет файлы package.json, соответствующие реальным модулям.

В итоге смотрите: Как сделать, чтобы require в node.js был всегда относительно корневой папки проекта? как упомянуто выше Петром Ковальчуком. На этот пост у вас есть два реальных варианта:

  1. Используйте относительные пути к файлам.
  2. Упакуйте нужный вам ресурс как настоящий модуль с файлом package.json и поместите его в папку node_modules.

Наконец, имейте в виду, что то, что вы пытаетесь сделать, противоречит сути программы, которую вы используете. Я думаю, что это один из случаев, когда вы в конечном итоге сделаете вашу жизнь проще (и ваших соавторов!), Перейдя на грань Node и используя относительные пути к файлам в соответствии с замыслом проекта.

Ответ 2

Я не мог найти лучшего решения, чем написать собственный модуль 😊.

Итак, мне нравится чистый код, и такой уродливый путь внутри require убивал меня. Я нашел много решений, как это исправить, но то, что мне понравилось, идеально подходило для систем Linux, но не для Windows. Тогда я решаю это исправить.

Сексуальная требуется 💃🏻💃🏻💃🏻

После тестирования в некоторых проектах я решил сделать его открытым исходным кодом ".

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


Начиная

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

  1. Установите пакет: npm install sexy-require --save

  2. Включите require('sexy-require') один раз в начало вашего основного файла приложения.

    require('sexy-require');
    const routers = require('/routers');
    const api = require('$api');
    ...
    
  3. Необязательный шаг. Конфигурация пути может быть определена в файле .paths в корневом каталоге вашего проекта.

    $db = /server/database
    $api-v1 = /server/api/legacy
    $api-v2 = /server/api/v2
    


Список путей

В любом месте вашего проекта вы можете получить определенные пути быстрого доступа:

    const path = require('sexy-require');
    console.log(path.$db); // -> '/full/path/to/app/server/database'

Ответ 3

Кажется, что функция загрузки модуля добавляет node_modules/ к аргументу. Например, поместите следующий script в /tmp/t.js:

meow = require('meow/meow.js');

создайте (mkdir) /tmp/node_modules/ и попробуйте запустить его с BSD ktrace (или Linux 'strace, который обеспечивает сопоставимую функциональность). Node попытается открыть следующее:

  • /tmp/node_modules/meow/meow.js
  • /tmp/node_modules/meow/meow.js.js
  • /tmp/node_modules/meow/meow.js.json
  • /tmp/node_modules/meow/meow.js.node
  • /tmp/node_modules/meow/meow.js/package.json
  • /tmp/node_modules/meow/meow.js/index.js
  • /tmp/node_modules/meow/meow.js/index.json
  • /tmp/node_modules/meow/meow.js/index.node

Если у вас нет подкаталога node_modules/ рядом с вашим script, он вообще не будет искать нигде относительно вашего script.

Ответ 4

global.__require = function (file) {
  return require(__dirname + '/' + file)
}

Поместите это в верхнюю часть вашего файла точки входа (например, index.js). Тогда вы можете просто использовать

const foo = __require('src/foo').

Я использую двойное подчеркивание как оду __dirname но вы можете переименовать его как угодно!

Ответ 5

Я не думаю, что нам нужно обсуждать эту проблему. Это дизайн для простого разработчика.
Если нам требуется /config.json, возможно, в подпапке есть много config.json, что, как правило, усложняет понимание

-- app/
   |- controller
      |- config.json(2) 
   |- models/
      |- user.js
      |- config.json(3)
   |- config.json(1)

Теперь скажите мне, как вы знаете, какой конфигурационный файл вам нужно выбрать.
Решение: user.js

var config1 = require('../config.json');
var config2 = require('../controller/config.json');
var config3 = require('./config.json');

если есть только один конфиг, вам лучше указать глобальную переменную и использовать ее оттуда.