รวมไฟล์. js ภายนอกในแอป node.js


98

ฉันมีแอปพลิเคชันโหนด 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 ผ่านฟังก์ชันที่ส่งออกบางประเภทซึ่งคุณสามารถอ้างอิงได้ ที่หรือต้องการพังพอนภายในรถ js.
Robert

3
Node.js ใช้ CommonJS ซึ่งแบ่งโค้ดของคุณออกเป็นโมดูลต่างๆ หลักการง่ายๆขอบเขตของโค้ดในแอป Node คือไฟล์ที่กำหนดไว้ดังนั้นคุณจะต้องใช้พังพอนใน car.js และใน car.js คุณจะต้องส่งออกส่วนที่เหลือของแอปของคุณ จำเป็นต้องใช้ในไฟล์หลักของคุณเช่นที่คุณกำลังทำอยู่
Matt Greer

คำตอบ:


100

การให้ความสำคัญกับสิ่งที่คนอื่นพูดvar fooในระดับบนสุดไม่ได้สร้างตัวแปรทั่วโลก global.fooถ้าคุณต้องการตัวแปรทั่วโลกแล้วเขียน แต่เราทุกคนรู้ดีว่าโลกเป็นสิ่งชั่วร้าย

หากคุณเป็นคนที่ใช้ globals แบบนั้นในโปรเจ็กต์ node.js ที่ฉันใช้อยู่ฉันจะ refactor พวกมันออกไปเนื่องจากมีกรณีการใช้งานเพียงไม่กี่กรณีสำหรับสิ่งนี้ (มีข้อยกเว้นบางประการ แต่ไม่ใช่กรณีนี้)

// 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
เคล็ดลับสำหรับทุกคนที่อ่านหนังสือคุณสามารถทำการ exports.foo แทน module.exports.foo
Tyler Egeto

9
@TylerEgeto ฉันมักจะรู้สึกปลอดภัยมากขึ้นถ้าฉันใช้เวอร์ชันที่ยาวขึ้น;)
Raynos

3
คุณช่วยขยายตัวอย่างเพื่อแสดงว่าสามารถใช้ตัวแปรที่กำหนดภายใน car.js ในแอปหลักได้อย่างไร เช่นฟังก์ชัน make (... ) {... CarModel = mongoose.model ('Car', CarSchema); } `ภายในแอพหนึ่งใช้ CarModel อย่างไร?
Marius

:)) ตกลงแล้วเมื่อตั้งค่า var หลายตัวในฟังก์ชันได้อย่างไร? เช่นหลายรุ่นหรือแม้กระทั่ง 3 รุ่นและอีก 2 อย่าง? ควรส่งคืนเป็นส่วนหนึ่งของวัตถุหรือไม่? เช่นreturn {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Marius

57

คำตอบที่ถูกต้องมักจะต้องใช้ แต่ในบางกรณีก็ไม่สามารถทำได้

รหัสต่อไปนี้จะทำเคล็ดลับ แต่ใช้ด้วยความระมัดระวัง:

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?
Steven Lu

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()
คริส

8

คุณสามารถใส่

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

ที่ด้านบนของไฟล์ car.js เพื่อให้ใช้งานได้หรือคุณสามารถทำสิ่งที่ Raynos บอกให้ทำ


4

หากคุณต้องการทดสอบไลบรารีจากบรรทัดคำสั่งคุณสามารถทำได้:

cat somelibrary.js mytestfile.js | node

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.