2016-07-21 39 views
5

Napisałem bardzo prosty moduł lokalny do zarządzania kilkoma liniami zlokalizowanego tekstu. Używa węzła require do ładowania plików językowych, ale najprawdopodobniej mam problemy ze ścieżkami. Otrzymuję błąd Cannot find module.Nie można znaleźć modułu - ścieżki względne

Struktura plików

. 
+-- local_modules 
| +-- lang 
| | +-- package.json 
| | +-- index.js 
+-- locale 
| +-- en.js 
| +-- de.coffee 
+-- init.js 
+-- index.coffee 
+-- package.json 

odpowiedniego modułu kod

Gdyby require plik, jeśli nie jest już załadowany.

join = require('path').join; 
_config.path = './locale'; 
lang = 'en'; 
_locales = {}; 

if(!_locales[lang]){ 
    _locales[lang] = require(join(_config.path, lang)); 
} 

Każdy plik w katalogu locale to typowy moduł node.js, na przykład en.js:

module.exports = { 
    test: 'Hello World!' 
}; 

Moduł lokalny eksportuje function(req, res, next){}, który jest używany jako Express, middleware i rzekomą do dołącz wymagany obiekt z lokalnymi ciągami do res.locals, ale widzę błąd Cannot find module 'locale/en'.

Próbowałem ręcznie dodać rozszerzenia .js (ale to nie powinno być konieczne, o ile wiem). Próbowałem również różnych odmian na ścieżce, takich jak locale lub /locale.


Moduł jest wywoływany w index.coffee.
App jest uruchamiany za pomocą init.js, który zawiera następujące elementy:

require('coffee-script/register'); 
require('./index'); 

może to tylko, że moduł jest .js (a moduł sam nie posiada coffeescript jako zależność), więc to nie może załadować .coffee plik? Chociaż CoffeeScript powinien być zarejestrowany na całym świecie, czy też się mylę? Tak czy inaczej, nie działa również z plikiem .js, więc myślę, że ma to coś wspólnego ze ścieżkami.

+0

Moim zdaniem lepiej użyć następnej konstrukcji: path.join (__ dirname, "locale"); __nazwa zawiera bezwzględną ścieżkę i twój problem związany ze ścieżką względną. Możesz także spróbować zdefiniować rozszerzenie pliku lang = 'en.js'; –

+0

* upd. Po prostu wypróbowano lokalnie, path.join, aby rozwiązać "./" jako "", więc używaj absolutnej ścieżki lub wymagaj ('./' + join (_config.path, lang)); –

+0

Z '__dirname', szuka wewnątrz folderu modułu. Z 'require ('./' + join (_config.path, lang));' wynik jest taki sam jak poprzednio (nie można znaleźć modułu). Więc nie działa. – ROAL

Odpowiedz

1

path.join() normalizuje utworzony drogę, która (prawdopodobnie) oznacza ./ część zawsze usunięto, co pozostało tylko względny ścieżką.

Zamiast tego, gdy jest używany path.resolve(), tworzy bezwzględną ścieżkę, która jest potrzebna w tym przypadku.

Powiązane problemy