Включить внешний .js файл в node.js приложении
У меня есть приложение app.js node. По мере того, как этот файл начинает расти, я хотел бы переместить часть кода в некоторые другие файлы, которые я бы "требовал" или "включать" в файл 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
Чтобы сделать акцент на том, что говорили все остальные, 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;
Ответ 2
Правильный ответ обычно используется, но в некоторых случаях это невозможно.
Следующий код выполнит трюк, но используйте его с осторожностью:
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");
Ответ 3
Короткий ответ:
// lib.js
module.exports.your_function = function () {
// Something...
};
// app.js
require('./lib.js').your_function();
Ответ 4
вы можете поместить
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
в верхней части вашего файла car.js, чтобы он работал, или вы можете сделать то, что сказал Рейнос.
Ответ 5
Если вы просто хотите протестировать библиотеку из командной строки, вы можете сделать:
cat somelibrary.js mytestfile.js | node
Ответ 6
Этот подход работает для меня в 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)
};
})