在node.js app中包含外部.js文件

Luc*_*Luc 97 javascript node.js

我有一个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');
Run Code Online (Sandbox Code Playgroud)

在car.js:

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

我收到了错误:

ReferenceError: Schema is not defined
Run Code Online (Sandbox Code Playgroud)

我只是想加载car.js的内容(而不是在同一个app.js文件中包含所有内容)在node.js中是否有一种特殊的方法可以做到这一点?

Ray*_*nos 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);
Run Code Online (Sandbox Code Playgroud)

在car.js

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

module.exports.make = make;
Run Code Online (Sandbox Code Playgroud)

  • 任何人阅读的提示,你可以做exports.foo,而不是module.exports.foo (32认同)
  • @TylerEgeto如果我使用更长的版本,我总觉得更安全;) (9认同)
  • 你能否扩展一下这个例子来展示如何在主app中使用car.js中定义的变量?例如`function make(...){... CarModel = mongoose.model('Car',CarSchema); 在应用程序内部,如何使用CarModel? (3认同)

kyb*_*kos 55

正确的答案通常是使用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");
Run Code Online (Sandbox Code Playgroud)

  • 聪明的解决方案...元编程FTW!:-) (4认同)
  • 问题是:"运行代码无法访问本地范围." http://nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_filename (2认同)

Dor*_*ian 18

简短回答:

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

// app.js
require('./lib.js').your_function();
Run Code Online (Sandbox Code Playgroud)

  • @Manoj你必须在./之前加上lib.js的前缀:`require('./ lib.js').your_function()` (2认同)

Ste*_*hen 8

你可以把

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
Run Code Online (Sandbox Code Playgroud)

在你的car.js文件的顶部,它可以工作,或者你可以做Raynos所说的事情.