नोड .js ऐप में बाहरी .js फ़ाइल शामिल करें


98

मेरे पास एक 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');

in.js:

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

मुझे त्रुटि मिली:

ReferenceError: Schema is not defined

मैं बस car.js की सामग्री लोड करने के लिए देख रहा हूँ (बजाय एक ही app.js फ़ाइल में सब कुछ होने के नाते) वहाँ एक particuliar तरीका है नोड में ऐसा करने के लिए। Js?


1
स्कीमा उस दायरे में मौजूद नहीं है। आप किसी प्रकार के निर्यात किए गए फ़ंक्शन के माध्यम से स्कीमा को कार में लाने का प्रयास कर सकते हैं, इस तरह से आप इसे संदर्भित कर सकते हैं। कि कार के भीतर मानस की आवश्यकता है।
रॉबर्ट

3
Node.js CommonJS का उपयोग करता है, जो आपके कोड को विभिन्न मॉड्यूल में विभाजित करता है। अंगूठे का त्वरित नियम, एक नोड ऐप में कोड का दायरा वह फ़ाइल है जिसे इसमें परिभाषित किया गया है। इसलिए आपको car.js में mongoose की आवश्यकता होगी, और car.js में आपको अपने बाकी एप्लिकेशन को जो भी निर्यात करना होगा। जरूरतों को तब आपकी मुख्य फाइल में इसकी आवश्यकता होती है जैसे आप कर रहे हैं।
मैट ग्रीर

जवाबों:


100

var fooशीर्ष स्तर में हर कोई जो कह रहा है उस पर जोर देने के लिए एक वैश्विक चर नहीं बनाता है। यदि आप एक वैश्विक चर चाहते हैं तो लिखें global.foo। लेकिन हम सभी जानते हैं कि ग्लोबल्स बुराई हैं।

यदि आप कोई है जो एक नोड.जेएस परियोजना में उस तरह ग्लोबल्स का उपयोग करता है तो मैं उन्हें दूर कर दूंगा क्योंकि इसके लिए बस कुछ ही उपयोग के मामले हैं (कुछ अपवाद हैं लेकिन यह एक नहीं है)।

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

in.js

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

module.exports.make = make;

32
किसी को भी पढ़ने के लिए टिप, आप सिर्फ Export.foo कर सकते हैं, फिर मॉड्यूल.exports.foo
टायलर ईगेटो

9
@TylerEgeto मैं हमेशा सुरक्षित महसूस करता हूं अगर मैं लंबे संस्करण का उपयोग करता हूं;)
रेयनोस

3
क्या आप यह दिखाने के लिए उदाहरण का विस्तार करेंगे कि मुख्य ऐप में कार के अंदर परिभाषित चर का उपयोग कैसे किया जा सकता है? जैसे `फ़ंक्शन मेक (...) {... CarModel = mongoose.model ('कार', कारसेमा); } `ऐप के अंदर, CarModel का उपयोग कैसे करता है?
Marius

:)) ठीक है, कैसे के बारे में जब समारोह में कई vars सेट? उदाहरण के लिए कई मॉडल, या यहां तक ​​कि 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
पेटा

यह कैसा है #include?
स्टीवन लू

18

संक्षिप्त जवाब:

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

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

यह मेरे लिए काम नहीं कर रहा है। मुझे त्रुटि हो रही है Cannot find module lib.js
मनोज

2
@ मैनोज आपको lib.js के साथ उपसर्ग करना है ।/ जैसे:require('./lib.js').your_function()
क्रिस

8

आप रख सकते हैं

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

अपनी कार के शीर्ष पर। काम करने के लिए इसे फाइल करें, या आप वह कर सकते हैं जो रेन्नोस ने करने के लिए कहा था।


4

यदि आप कमांड लाइन से लाइब्रेरी का परीक्षण करना चाहते हैं, तो आप कर सकते हैं:

cat somelibrary.js mytestfile.js | node

0

यह दृष्टिकोण मेरे लिए Node.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)
    };
})

ये गलत है। "एफएस" कभी भी निर्यात नहीं किया जाता है! सख्त मोड पर काम नहीं करेंगे जो ES6 में डिफ़ॉल्ट है
MyUserInStackOverflow
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.