在node.js应用程序中包含外部.js文件


97

我有一个app.js节点应用程序。随着此文件开始增长,我想将代码的某些部分移到app.js文件中“需要”或“包含”的其他文件中。

我正在尝试类似的事情:

// Declare application
var app = require('express').createServer();

// Declare usefull stuff for DB purposes
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

// THE FOLLOWING REQUIRE DOES NOT WORK
require('./models/car.js');

在car.js中:

// Define Car model
CarSchema = new Schema({
  brand        : String,
  type : String
});
mongoose.model('Car', CarSchema);

我得到了错误:

ReferenceError: Schema is not defined

我只是想加载car.js的内容(而不是将所有内容都放在同一个app.js文件中)在node.js中是否有一种特殊的方式来实现?


1
模式在该范围中不存在。您可以尝试通过某种导出函数将Schema传递到car.js中,从而可以引用它。或在car.js中要求猫鼬。
罗伯特

3
Node.js利用CommonJS,它将代码分成不同的模块。快速的经验法则是,Node应用程序中的代码范围是定义它的文件。因此,您需要在car.js中使用猫鼬,在car.js中,您需要导出应用程序的其余部分然后像您一样在主文件中要求它。
Matt Greer

Answers:


100

强调其他所有人var foo在顶层所说的话并不会创建全局变量。如果要全局变量,请编写global.foo。但是我们知道全球人是邪恶的。

如果您是在node.js项目中使用过类似全局变量的人,那么我会重构它们,因为这样做的用例很少(有一些例外,但这不是一个例外)。

// Declare application
var app = require('express').createServer();

// Declare usefull stuff for DB purposes
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

require('./models/car.js').make(Schema, mongoose);

在car.js中

function make(Schema, mongoose) {
    // Define Car model
    CarSchema = new Schema({
      brand        : String,
      type : String
    });
    mongoose.model('Car', CarSchema);
}

module.exports.make = make;

32
给所有阅读者的提示,您可以只执行export.foo,而不是module.exports.foo
Tyler Egeto 2011年

9
@TylerEgeto如果使用更长的版本,我总是会感到更安全;)
Raynos 2011年

3
您能否扩展示例以显示如何在主应用程序中使用在car.js内部定义的变量?例如`function make(...){... CarModel = mongoose.model('Car',CarSchema); }`在应用程序内,一个人如何使用CarModel?
Marius 2012年

:))好吧,当在函数内设置多个变量时怎么样?例如多个模型,甚至3个模型,还有2个其他模型?是否应该将它们作为对象的一部分返回?例如return {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Marius 2012年

56

正确的答案通常是使用require,但在少数情况下是不可能的。

以下代码可以解决问题,但请谨慎使用:

var fs = require('fs');
var vm = require('vm');
var includeInThisContext = function(path) {
    var code = fs.readFileSync(path);
    vm.runInThisContext(code, path);
}.bind(this);
includeInThisContext(__dirname+"/models/car.js");

2
问题是:“正在运行的代码无法访问本地范围。” nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_filename
Petah

这是什么样的#include
史蒂文·卢

18

简短答案:

// lib.js
module.exports.your_function = function () {
  // Something...
};

// app.js
require('./lib.js').your_function();

这对我不起作用。我出错了Cannot find module lib.js
Manoj

2
@Manoj,您必须在lib.js之前加上./前缀:require('./lib.js').your_function()
Chris

8

你可以放

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

可以在car.js文件顶部运行,也可以按照Raynos所说的做。



0

这种方法在Node.js中对我有用,这有什么问题吗?

文件“ include.js”:

fs = require('fs');

文件“ main.js”:

require('./include.js');

fs.readFile('./file.json', function (err, data) {
    if (err) {
        console.log('ERROR: file.json not found...')
    } else {
        contents = JSON.parse(data)
    };
})

错了 “ fs”从不导出!无法在ES6中默认的严格模式下使用
MyUserInStackOverflow
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.