sertakan file .js eksternal di aplikasi node.js

97

Saya memiliki aplikasi node app.js. Saat file ini mulai tumbuh, saya ingin memindahkan beberapa bagian kode di beberapa file lain yang akan "saya perlukan" atau "sertakan" di file app.js.

Saya mencoba hal-hal seperti:

// 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');

di car.js:

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

Saya mendapat kesalahan:

ReferenceError: Schema is not defined

Saya hanya ingin memuat konten car.js (alih-alih memuat semuanya di file app.js yang sama) Apakah ada cara khusus untuk melakukan ini di node.js?

Luc
sumber
1
Skema tidak ada dalam cakupan itu. Anda bisa mencoba meneruskan Schema ke car.js melalui beberapa jenis fungsi yang diekspor, dengan cara itu Anda bisa mereferensikannya. Itu atau membutuhkan luwak di dalam car.js.
Robert
3
Node.js menggunakan CommonJS, yang membagi kode Anda menjadi modul yang berbeda. Aturan praktisnya, cakupan kode dalam aplikasi Node adalah file yang ditentukan. Jadi, Anda perlu meminta luwak di car.js, dan di car.js Anda perlu mengekspor apa pun yang ada di aplikasi Anda kebutuhan kemudian membutuhkannya di file utama Anda seperti yang Anda lakukan.
Matt Greer

Jawaban:

100

Menekankan apa yang orang lain katakan var foodi tingkat atas tidak menciptakan variabel global. Jika Anda menginginkan variabel global, tulis global.foo. tapi kita semua tahu global itu jahat.

Jika Anda adalah seseorang yang menggunakan global seperti itu dalam proyek node.js yang saya ikuti, saya akan merefaktornya karena hanya ada sedikit kasus penggunaan untuk ini (Ada beberapa pengecualian tetapi ini bukan satu).

// 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);

di car.js

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

module.exports.make = make;
Raynos
sumber
32
Kiat untuk siapa pun yang membaca, Anda dapat melakukan exports.foo, lalu module.exports.foo
Tyler Egeto
9
@TylerEgeto Saya selalu merasa lebih aman jika saya menggunakan versi yang lebih panjang;)
Raynos
3
Bisakah Anda memperluas contoh untuk menunjukkan bagaimana seseorang dapat menggunakan variabel yang ditentukan di dalam car.js di aplikasi utama? misalnya `function make (...) {... CarModel = mongoose.model ('Car', CarSchema); } `Di dalam aplikasi, bagaimana seseorang menggunakan CarModel?
Marius
:)) Ok, bagaimana jika mengatur beberapa vars di dalam fungsi? misalnya beberapa model, atau bahkan 3 model, dan 2 model lain? Haruskah mereka dikembalikan sebagai bagian dari suatu objek? misalnyareturn {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Marius
56

Jawaban yang benar biasanya menggunakan Requirement, tetapi dalam beberapa kasus hal itu tidak memungkinkan.

Kode berikut akan melakukan triknya, tetapi gunakan dengan hati-hati:

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");
kybernetikos
sumber
2
Masalahnya adalah: "Menjalankan kode tidak memiliki akses ke cakupan lokal." nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_filename
Petah
Seperti apa ini #include?
Steven Lu
18

Jawaban singkat:

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

// app.js
require('./lib.js').your_function();
Dorian
sumber
Ini tidak berhasil untuk saya. Saya mendapatkan kesalahan Cannot find module lib.js.
Manoj
2
@Manoj Anda harus mengawali lib.js dengan ./ seperti ini:require('./lib.js').your_function()
Chris
8

Anda bisa meletakkan

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

di bagian atas file car.js Anda agar berfungsi, atau Anda dapat melakukan apa yang dikatakan Raynos.

Stephen
sumber
4

Jika Anda hanya ingin menguji pustaka dari baris perintah, Anda dapat melakukan:

cat somelibrary.js mytestfile.js | node
Bouke Versteegh
sumber
0

Pendekatan ini berfungsi untuk saya di Node.js, Apakah ada masalah dengan yang ini ?

File 'include.js':

fs = require('fs');

File '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)
    };
})
Marcio Pamplona
sumber
Ini salah. "fs" tidak pernah diekspor! Tidak akan berfungsi pada mode ketat yang default di ES6
MyUserInStackOverflow