将模块包含到另一个nodeJS文件中

时间:2015-06-13 12:23:03

标签: javascript node.js

我刚开始使用Node并编写了一个类似于以下内容的S3读取器。它位于 projectRoot / routes / S3Store.js 目录中。

var AWS = require('aws-sdk'),
uploader = require('s3-upload-stream')(new AWS.S3()),
Q = require('q');

module.exports = S3Store;

function S3Store(config) {
    this.config = config;
    this.s3 = new AWS.S3({
    region: config.aws.region
    });
}

S3Store.prototype.readStream = function (filePath, metadata) {
var readConfig = {
    'Bucket': this.config.s3.bucketName,
    'Key': filePath
    };
return this.s3.getObject(readConfig).createReadStream();
}

现在,我在 projectRoot / routes / S3StoreMain.js 中创建了一个新文件 S3StoreMain.js ,我正在尝试导入 S3Store.js 模块如下:

var s3 = require('S3Store');

跑步时:

node S3StoreMain.js

找不到模块S3Store。这是堆栈跟踪:

shubham@turing:~/Downloads/node-v0.12.4/exp2014$ node routes/S3StoreMain.js 

module.js:340
    throw err;
      ^
Error: Cannot find module 'S3Store'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/home/shubham/Downloads/node-v0.12.4/exp2014/routes/S3StoreMain.js:1:72)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
shubham@turing:~/Downloads/node-v0.12.4/exp2014$ 

我错过了什么?

3 个答案:

答案 0 :(得分:1)

如果模块不是npm模块,你必须在require参数内给出模块的相对路径,因为如果你只是在require中给出模块的名称,它将搜索在node_modules文件夹中。

所以,使用以下相对路径,我希望它能解决您的问题。 var s3 = require('./S3Store.js');

另外,尝试将module.exports语句放在文件末尾。

答案 1 :(得分:1)

Read this NodeJS API Reference

为了相对需要模块文件,你需要使用相对路径...这就是如何在NodeJS中设计require模块(阅读链接的API文档以获取更多信息)

尝试从S3StoreMain文件中请求S3Store文件,如下所示:

var s3 = require("./S3Store");

您可以省略".js",它是可选的。

请注意,每个人都说您需要将modules.exports放在文件的末尾...这是 false !!由于您定义了函数的方式,引用无关紧要。

答案 2 :(得分:0)

许多人建议,在调用模块时需要使用相对路径。所以,这样的事情对我有用:

var s3 = require('./S3Store');

由于我只接受一个答案,我会选择一个解释最佳的答案。