node.js uygulamasına harici .js dosyasını dahil et


98

Bir app.js düğüm uygulamam var. Bu dosya büyümeye başladığında, kodun bir kısmını app.js dosyasında "gerektirecek" veya "dahil edeceğim" diğer bazı dosyalarda taşımak istiyorum.

Şunun gibi şeyler deniyorum:

// 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'de:

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

Hatayı aldım:

ReferenceError: Schema is not defined

Sadece car.js içeriğinin yüklenmesini istiyorum (her şeyin aynı app.js dosyasında olması yerine) Bunu node.js'de yapmanın özel bir yolu var mı?


1
Bu kapsamda şema yok. Schema'yı bir tür dışa aktarılan işlev aracılığıyla car.js'ye geçirmeyi deneyebilirsiniz, bu şekilde ona başvurabilirsiniz. Bu veya araba içinde firavun faresi gerektirir.js.
Robert

3
Node.js, kodunuzu farklı modüllere ayıran CommonJS'yi kullanır. Temel kural, bir Node uygulamasındaki kodun kapsamı, içinde tanımlandığı dosyadır. Bu nedenle, car.js'de mongoose'a ihtiyacınız olacak ve car.js'de, uygulamanızın geri kalanı ne olursa olsun dışa aktarmanız gerekecektir. ihtiyaç duyduğunuzda, yaptığınız gibi ana dosyanızda olması gerekir.
Matt Greer

Yanıtlar:


100

Başkalarının var fooen üst düzeyde söylediklerine vurgu yapmak, küresel bir değişken yaratmaz. Global bir değişken istiyorsanız, yazın global.foo. ama biz tüm globaller kötülük olduğunu biliyoruz.

Bir node.js projesinde bu tür globalleri kullanan biriyseniz, bunun için çok az kullanım durumu olduğu için onları yeniden düzenlerdim (Birkaç istisna var ama bu bir değil).

// 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'de

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

module.exports.make = make;

32
Okuyan herkes için ipucu, module.exports.foo yerine sadece export.foo yapabilirsiniz
Tyler Egeto

9
@TylerEgeto Daha uzun sürümü kullanırsam kendimi her zaman daha güvende hissediyorum;)
Raynos

3
Ana uygulamada car.js içinde tanımlanan değişkenlerin nasıl kullanılabileceğini göstermek için lütfen örneği genişletir misiniz? ör. `function make (...) {... CarModel = firavunyasi.model ('Car', CarSchema); } `Uygulamanın içinde CarModel nasıl kullanılır?
Marius

:)) Tamam, fonksiyonun içinde birden çok değişken ayarlamaya ne dersiniz? örneğin birden fazla model, hatta 3 model ve 2 başka bir şey var mı? Bir nesnenin parçası olarak iade edilmeli mi? egreturn {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Marius

57

Doğru cevap genellikle zorunlu kullanmaktır, ancak bazı durumlarda bu mümkün değildir.

Aşağıdaki kod işe yarayacaktır, ancak dikkatli kullanın:

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
Bununla ilgili sorun şudur: "Çalışan kodun yerel kapsama erişimi yok." nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_filename
Petah

Bu neye benziyor #include?
Steven Lu

18

Kısa cevap:

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

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

Bu benim için çalışmıyor. Ben hatası alıyorum Cannot find module lib.js.
Manoj

2
@Manoj, lib.js önekini ./ ile şu şekilde eklemelisiniz:require('./lib.js').your_function()
Chris

8

koyabilirsin

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

Çalışması için car.js dosyanızın üst kısmına veya Raynos'un dediğini yapabilirsiniz.


4

Bir kitaplığı komut satırından test etmek istiyorsanız, şunları yapabilirsiniz:

cat somelibrary.js mytestfile.js | node

0

Bu yaklaşım benim için Node.js'de çalışıyor, bununla ilgili herhangi bir sorun var mı ?

'İnclude.js' dosyası:

fs = require('fs');

'Main.js' dosyası:

require('./include.js');

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

Bu yanlış. "fs" asla ihraç edilmez! ES6'da varsayılan olan katı modda çalışmaz
MyUserInStackOverflow
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.