为什么节点找不到我的模块?

时间:2015-08-07 15:21:37

标签: node.js

我正在使用节点v0.12.5和nwjs,我已经在我的项目中定义了自己的自定义模块,这样我就可以模块化我的项目(显然)。

我正在尝试从我项目中的另一个模块调用我的模块,但每次我尝试要求它时都会收到错误could not find module 'uploader'

我的上传器模块目前非常简单,如下所示:

function ping_server(dns, cb) {
    require('dns').lookup(dns, function(err) {
        if (err && err.code == "ENOTFOUND") {
            cb(false);
        } else {
            cb(true);
        }
    })
}

function upload_files()
{

}

module.exports.ping_server  = ping_server;
module.exports.upload_files = upload_files;

如果在测试设备有互联网连接时可以ping通文件,那么它将用于递归推送文件到请求的服务器。

我相信我已使用module.exports语法正确导出了这些方法,然后我尝试使用以下方法将此模块包含在test.js文件中:

var uploader = require('uploader');

我也试过

var uploader = require('uploader.js');

但我相信如果指定了uploader.js,节点会自动查找uploader

我的应用的文件层次结构如下:

package.json
public
 |-> lib
      |-> test.js
      |-> uploader.js
 |-> css
 |-> img

我唯一想到的是,我听说node会尝试获取要包含在应用程序根目录下的node_modules文件夹,这可能导致节点无法找到它吗?如果没有,为什么节点不能从test.js看到我的文件,因为它们存在于同一目录中?

更新对于混淆,我们也尝试使用require('./uploader'),但我仍然收到错误:Uncaught Error: Cannot find module './uploader'

更新2 我通常完全反对使用图片来传达SO上的代码问题,但我认为这将极大地帮助解决这个问题:

enter image description here

这里很清楚test.js和uploader.js位于同一位置

4 个答案:

答案 0 :(得分:1)

如果您未向require()传递路径(相对或绝对路径),则会对传入的名称执行模块查找。

将您的require('uploader')更改为require('./uploader')require(__dirname + '/uploader')

答案 1 :(得分:0)

要加载本地模块(即不是来自node_modules的模块),您需要在路径前加./https://nodejs.org/api/modules.html#modules_modules

所以在你的情况下,它将是var uploader = require('./uploader');

答案 2 :(得分:0)

这个问题源于使用Node Webkit而不是直接节点,如其文档中所述,所有模块都将来自项目根目录下的node_modules目录。

任何内部非C ++库都应放在node_modules目录中,以便Node webkit到find them

因此,为了解决这个问题,我只在项目的根目录(app和public之外)添加了一个node_modules目录,并将uploader.js文件放在那里。现在,当我致电require('uploader')时,它按预期工作。

答案 3 :(得分:0)

如果在Mac上进行开发,请检查文件系统是否区分大小写。可能是所需的文件名大写错误。