【发布时间】:2016-07-21 17:52:52
【问题描述】:
我编写了一个非常简单的本地模块来管理几行本地化文本。
它使用节点的require 来加载语言文件,但很可能我遇到了路径问题。
我收到了Cannot find module 错误。
文件结构
.
+-- local_modules
| +-- lang
| | +-- package.json
| | +-- index.js
+-- locale
| +-- en.js
| +-- de.coffee
+-- init.js
+-- index.coffee
+-- package.json
相关模块代码
如果文件尚未加载,则应require。
join = require('path').join;
_config.path = './locale';
lang = 'en';
_locales = {};
if(!_locales[lang]){
_locales[lang] = require(join(_config.path, lang));
}
locale 目录下的每个文件都是一个典型的 Node.js 模块,例如en.js:
module.exports = {
test: 'Hello World!'
};
本地模块导出一个function(req, res, next){},用作Express中间件,假设
将带有本地化字符串的所需对象附加到res.locals,但是,我看到Cannot find module 'locale/en' 错误。
我已尝试手动添加 .js 扩展名(但据我所知,这不是必需的)。
我还尝试了路径上的不同变体,例如locale 或/locale。
模块在index.coffee中调用。
应用使用init.js启动,包含以下内容:
require('coffee-script/register');
require('./index');
也许只是模块是.js(并且模块本身没有CoffeeScript作为依赖项)所以它无法加载.coffee文件?虽然 CoffeeScript 应该在全球范围内注册,还是我错了?无论哪种方式,它都不适用于.js 文件,所以我猜它与路径有关。
【问题讨论】:
-
在我看来最好使用下一个构造:path.join(__dirname, 'locale'); __dirname 包含绝对路径,您的问题与相对路径有关。您也可以尝试定义文件扩展名 lang = 'en.js';
-
*更新。刚在本地试过,path.join将'./'解析为'',所以使用绝对路径,或者require('./' + join(_config.path, lang));
-
使用
__dirname,它在模块的文件夹中进行搜索。使用require('./' + join(_config.path, lang));,结果与以前相同(找不到模块)。所以,两者都不起作用。 -
根据文档 __dirname - 当前正在执行的脚本所在目录的名称。哦,废话,它可能与'coffee-script/register'有关吗?您可以尝试在 index.coffe 中打印 __dirname 值吗?它应该有助于组成正确的路径。
-
@NazarSakharenko 当我在
index.coffee中执行console.log(__dirname);时,它会打印正确的文件夹:/home/ubuntu/workspace(这是在 C9 机器上)。当我将__dirname放入模块代码中时,它会尝试访问路径/home/ubuntu/workspace/node_modules/lang/locale/en。我应该将__dirname作为参数传递吗?但是为什么其他模块不这样做呢?常规模块如何处理路径?
标签: javascript node.js coffeescript