यह जावास्क्रिप्ट "आवश्यकता" क्या है?


504

मैं एक PostgreSQL डेटाबेस को पढ़ने / लिखने के लिए जावास्क्रिप्ट प्राप्त करने की कोशिश कर रहा हूं। मुझे यह प्रोजेक्ट जीथब पर मिला । मैं नोड में चलने के लिए निम्न नमूना कोड प्राप्त करने में सक्षम था।

var pg = require('pg'); //native libpq bindings = `var pg = require('pg').native`
var conString = "tcp://postgres:1234@localhost/postgres";

var client = new pg.Client(conString);
client.connect();

//queries are queued and executed one after another once the connection becomes available
client.query("CREATE TEMP TABLE beatles(name varchar(10), height integer, birthday timestamptz)");
client.query("INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", ['Ringo', 67, new Date(1945, 11, 2)]);
client.query("INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", ['John', 68, new Date(1944, 10, 13)]);

//queries can be executed either via text/parameter values passed as individual arguments
//or by passing an options object containing text, (optional) parameter values, and (optional) query name
client.query({
  name: 'insert beatle',
  text: "INSERT INTO beatles(name, height, birthday) values($1, $2, $3)",
  values: ['George', 70, new Date(1946, 02, 14)]
});

//subsequent queries with the same name will be executed without re-parsing the query plan by postgres
client.query({
  name: 'insert beatle',
  values: ['Paul', 63, new Date(1945, 04, 03)]
});
var query = client.query("SELECT * FROM beatles WHERE name = $1", ['John']);

//can stream row results back 1 at a time
query.on('row', function(row) {
  console.log(row);
  console.log("Beatle name: %s", row.name); //Beatle name: John
  console.log("Beatle birth year: %d", row.birthday.getYear()); //dates are returned as javascript dates
  console.log("Beatle height: %d' %d\"", Math.floor(row.height/12), row.height%12); //integers are returned as javascript ints
});

//fired after last row is emitted
query.on('end', function() { 
  client.end();
});

इसके बाद मैंने इसे एक वेबपेज पर चलाने की कोशिश की, लेकिन ऐसा कुछ नहीं हुआ। मैंने जावास्क्रिप्ट कंसोल पर जाँच की और यह कहता है कि "परिभाषित नहीं होने की आवश्यकता है।"

तो यह "आवश्यकता" क्या है? यह नोड में क्यों काम करता है लेकिन वेबपेज में नहीं?

इसके अलावा, इससे पहले कि मुझे नोड में काम करने के लिए मिला, मुझे करना पड़ा npm install pg। यह किस बारे में है? मैंने निर्देशिका में देखा और एक फ़ाइल नहीं मिली। इसे कहां रखा गया, और जावास्क्रिप्ट इसे कैसे खोजता है?


45
आवश्यकता जावास्क्रिप्ट का हिस्सा नहीं है, यह एक कीवर्ड है जिसका उपयोग नोडज में किया जाता है। नोडज आप जिस क्लाइंट साइड का उपयोग करते हैं, वह डोमेन नहीं है। एक स्क्रिप्ट जो नोडज के साथ काम कर सकती है, वह ब्राउज़र में काम नहीं कर सकती है। क्या आप नोडज में विंडो या डॉक्यूमेंट कह सकते हैं? नहीं, ब्राउज़र के साथ आवश्यकता के लिए समान।
एमएम

8
मैं ऊपर दिए गए कोड को कैसे बदलूं, इसलिए यह एक ब्राउज़र में काम करेगा?
neuromancer

8
आप वेब पेज से सीधे Pg से बात नहीं कर सकते हैं; आपको एक सादा tcp / ip सॉकेट खोलने में सक्षम होना होगा जिसे आप बायनेरी डेटा भेज सकते हैं और प्राप्त कर सकते हैं, और कोई भी वेब ब्राउज़र आपको ऐसा नहीं करने देगा। जिस लाइब्रेरी की आप बात कर रहे हैं, वह नोड.जेएस के लिए एक एक्सटेंशन है और क्लाइंट जावास्क्रिप्ट में काम नहीं करेगी। मैं दृढ़ता से अनुशंसा करता हूं कि आप अपने वेबसर्वर और JSON अनुरोधों / उत्तरों के माध्यम से क्लाइंट से अपने PostgreSQL सर्वर से बात करें।
क्रेग रिंगर

1
मैं स्थानीय स्तर पर PostgreSQL चला रहा हूं। वेबसर्वर के लिए मुझे क्या इंस्टॉल करना होगा?
neuromancer

1
नोड? यह बहुत अच्छा वेबसर्वर है, या स्थानीय स्तर पर स्थापित करने के लिए एक हो सकता है।
टिमोथी मीड

जवाबों:


871

तो यह "आवश्यकता" क्या है?

require()मानक जावास्क्रिप्ट एपीआई का हिस्सा नहीं है। लेकिन Node.js में, यह एक विशेष उद्देश्य के साथ एक अंतर्निहित फ़ंक्शन है: मॉड्यूल लोड करने के लिए

मॉड्यूल एक फ़ाइल में अपने सभी एप्लिकेशन रखने के बजाय किसी एप्लिकेशन को अलग-अलग फ़ाइलों में विभाजित करने का एक तरीका है। यह अवधारणा सिंटैक्स और व्यवहार में मामूली अंतर के साथ अन्य भाषाओं में भी मौजूद है, जैसे सी include, पायथन import, और इसी तरह।

Node.js मॉड्यूल और ब्राउज़र जावास्क्रिप्ट के बीच एक बड़ा अंतर यह है कि एक स्क्रिप्ट का कोड किसी अन्य स्क्रिप्ट के कोड से कैसे एक्सेस किया जाता है।

  • ब्राउज़र जावास्क्रिप्ट में, स्क्रिप्ट को <script>तत्व के माध्यम से जोड़ा जाता है । जब वे निष्पादित करते हैं, तो वे सभी वैश्विक दायरे में प्रत्यक्ष पहुंच रखते हैं, सभी लिपियों के बीच एक "साझा स्थान"। कोई भी स्क्रिप्ट वैश्विक दायरे में किसी भी चीज़ को स्वतंत्र रूप से परिभाषित / संशोधित / हटा / कॉल कर सकती है।

  • Node.js में, प्रत्येक मॉड्यूल का अपना दायरा होता है। एक मॉड्यूल दूसरे मॉड्यूल में परिभाषित चीजों को सीधे एक्सेस नहीं कर सकता है जब तक कि वह उन्हें उजागर नहीं करता है। मॉड्यूल से चीजों को उजागर करने के लिए, उन्हें सौंपा जाना चाहिए exportsया module.exports। एक मॉड्यूल के लिए दूसरे मॉड्यूल का उपयोग करनाexports या module.exports, इसका उपयोग करना होगाrequire()

आपके कोड में, मॉड्यूल var pg = require('pg');लोड करता pgहै, Node.js. के लिए एक PostgreSQL क्लाइंट यह आपके कोड को pgचर के माध्यम से PostgreSQL क्लाइंट के एपीआई की कार्यक्षमता तक पहुंचने की अनुमति देता है ।

यह नोड में क्यों काम करता है लेकिन वेबपेज में नहीं?

require(), module.exportsऔर exportsNode.js. के लिए विशिष्ट मॉड्यूल प्रणाली के API हैं ब्राउज़र इस मॉड्यूल सिस्टम को लागू नहीं करते हैं।

इसके अलावा, इससे पहले कि मुझे नोड में काम करने के लिए मिला, मुझे करना पड़ा npm install pg। यह किस बारे में है?

एनपीएम एक पैकेज रिपॉजिटरी सेवा है जो कि जावास्क्रिप्ट मॉड्यूल प्रकाशित करता है। npm installएक कमांड है जो आपको उनके भंडार से पैकेज डाउनलोड करने देता है।

इसे कहां रखा गया, और जावास्क्रिप्ट इसे कैसे खोजता है?

Npm cli सभी डाउनलोड किए गए मॉड्यूल को एक node_modulesनिर्देशिका में रखता है जहां आप भागे थे npm install। Node.js में बहुत विस्तृत प्रलेखन है कि कैसे मॉड्यूल अन्य मॉड्यूल ढूंढते हैं जिसमें एक node_modulesनिर्देशिका खोजना शामिल है ।



2
Node.js को इस कार्यक्षमता की आवश्यकता क्यों होगी?
मेलब

23
@Melab क्योंकि एक विश्वविद्यालय कोडिंग अभ्यास से बड़ा कुछ करने के लिए कोड गुब्बारे जैसे ही मॉडर्नाइजेशन की आवश्यकता होती है और इसमें 1 से अधिक व्यक्ति शामिल होते हैं। यही कारण है कि हम उन्हें हमेशा से पसंद करते रहे हैं
डेविड टोनहोफर 16

3
PHP में समतुल्य include/require[_once]( php.net लिंक ) होगा, न कि use, जो एक अलियासिंग कीवर्ड है।
नेवरमाइंड

107

ठीक है, तो चलो पहले एक वेब ब्राउज़र में जावास्क्रिप्ट के बीच अंतर करना शुरू करते हैं , और एक सर्वर (कॉमनजेस और नोड) पर जावास्क्रिप्ट ।

जावास्क्रिप्ट एक पारंपरिक रूप से एक वेब ब्राउज़र तक सीमित भाषा है जिसे सीमित वैश्विक संदर्भ के साथ परिभाषित किया जाता है, जिसे ज्यादातर दस्तावेज़ ऑब्जेक्ट मॉडल (डोम) स्तर 0 (नेटस्केप नेविगेटर जावास्क्रिप्ट एपीआई) के रूप में जाना जाता है।

सर्वर-साइड जावास्क्रिप्ट उस प्रतिबंध को समाप्त करता है और जावास्क्रिप्ट को देशी कोड के विभिन्न टुकड़ों (जैसे पोस्टग्रैज लाइब्रेरी) और खुले सॉकेट में कॉल करने की अनुमति देता है।

अब require()एक विशेष फ़ंक्शन कॉल है जिसे कॉमनजेएस कल्पना के भाग के रूप में परिभाषित किया गया है। नोड में, यह नोड खोज पथ में पुस्तकालयों और मॉड्यूल को हल करता है, अब आमतौर पर node_modulesएक ही निर्देशिका (या इनवॉल्ड जावास्क्रिप्ट फ़ाइल की निर्देशिका) या सिस्टम-वाइड खोज पथ के रूप में परिभाषित किया जाता है।

आपके शेष प्रश्न का उत्तर देने का प्रयास करने के लिए, हमें ब्राउज़र और डेटाबेस सर्वर में चल रहे कोड के बीच एक प्रॉक्सी का उपयोग करने की आवश्यकता है।

चूँकि हम नोड के बारे में चर्चा कर रहे हैं और आप पहले से ही इस बात से परिचित हैं कि वहाँ से क्वेरी कैसे चल सकती है, इसलिए यह नोड को उस प्रॉक्सी के रूप में उपयोग करने के लिए समझ में आएगा।

एक सरल उदाहरण के रूप में, हम एक URL बनाने जा रहे हैं जो बीटल्स के बारे में कुछ तथ्य लौटाता है, जिसे JSON नाम दिया गया है।

/* your connection code */

var express = require('express');
var app = express.createServer();
app.get('/beatles/:name', function(req, res) {
    var name = req.params.name || '';
    name = name.replace(/[^a-zA_Z]/, '');
    if (!name.length) {
        res.send({});
    } else {
        var query = client.query('SELECT * FROM BEATLES WHERE name =\''+name+'\' LIMIT 1');
        var data = {};
        query.on('row', function(row) {
            data = row;
            res.send(data);
        });
    };
});
app.listen(80, '127.0.0.1');

2
यह भ्रामक है ... विधि createServerभ्रामक है ... यह सुझाव देता है कि मैं बस विली डेली सर्वर बना सकता हूं, जब भी मैं चाहता हूं ... इसके विपरीत मेरे WAMP प्रतिमान के साथ: लगभग 5 साल पहले मैंने स्थापित किया (उदाहरण के लिए।) ') मेरे windowsXP लैपटॉप पर एक सर्वर, और मैंने कभी भी' एक और सर्वर 'नहीं बनाया है ... अब अचानक मैं बस सर्वर बनाना शुरू कर सकता हूँ ... यह भ्रमित करने वाला है ..
dsdsdsdsd

और 'एक्सप्रेस' क्या है ... जब मैं C:\Program Files\nodejs\ किसी फ़ाइल या निर्देशिका के expressलिए
खोजता

1
एक्सप्रेस मिडलवेयर और फ्रेमवर्क का एक संग्रह है जो नोड में एक वेब सर्वर बनाना आसान बनाता है। जेएस, आपको इसे स्थापित करना होगा npm। आप अधिक जानकारी यहाँ पा सकते हैं: expressjs.com
टिमोथी मीड

यह बहुत अच्छी व्याख्या है। मेरे पास एक प्रश्न है कि दोनों पर्यावरण NodeJS और ब्राउज़र पर गतिशील पथों के साथ काम करने की आवश्यकता है?
एम। तुलसौद

29

इसका उपयोग मॉड्यूल लोड करने के लिए किया जाता है। आइए एक सरल उदाहरण का उपयोग करें।

फ़ाइल में circle_object.js:

var Circle = function (radius) {
    this.radius = radius
}
Circle.PI = 3.14

Circle.prototype = {
    area: function () {
        return Circle.PI * this.radius * this.radius;
    }
}

हम इसके माध्यम से उपयोग कर सकते हैं require, जैसे:

node> require('circle_object')
{}
node> Circle
{ [Function] PI: 3.14 }
node> var c = new Circle(3)
{ radius: 3 }
node> c.area()

require()विधि लोड और कैश जावास्क्रिप्ट मॉड्यूल के लिए प्रयोग किया जाता है। इसलिए, यदि आप एक स्थानीय, रिश्तेदार जावास्क्रिप्ट मॉड्यूल को Node.js एप्लिकेशन में लोड करना चाहते हैं, तो आप बस इसका उपयोग कर सकते हैंrequire() विधि का ।

उदाहरण:

var yourModule = require( "your_module_name" ); //.js file extension is optional

9
यदि आप इसे वेबपृष्ठ में उपयोग करने का प्रयास कर रहे हैं तो क्या होगा?
न्यूरोमैंसर

1
मैं ऊपर एक वेब पेज में लोड करने के लिए कोशिश कर रहा हूँ!
neuromancer

7
क्या पहला कोड ब्लॉक Circle_object.js नामक फ़ाइल में होना चाहिए?
user1416227

24

मैंने देखा कि जब दूसरे उत्तरों ने समझाया कि आवश्यकता क्या है और इसका उपयोग नोड में मॉड्यूल लोड करने के लिए किया जाता है तो उन्होंने ब्राउज़र पर काम करने के दौरान नोड मॉड्यूल को लोड करने के बारे में पूर्ण उत्तर नहीं दिया।

यह करना काफी सरल है। Npm का उपयोग करके अपने मॉड्यूल को स्थापित करें जैसा कि आप वर्णन करते हैं, और मॉड्यूल खुद एक फ़ोल्डर में स्थित होगा जिसे आमतौर पर नोड_मॉड्यूल्स कहा जाता है।

अब इसे अपने ऐप में लोड करने का सबसे सरल तरीका यह है कि इसे अपने HTML से एक स्क्रिप्ट टैग के साथ संदर्भित किया जाए जो इस निर्देशिका को इंगित करता है। यानी यदि आपका index_modules निर्देशिका प्रोजेक्ट के रूट में उसी स्तर पर है जैसा कि आपका index.html आप इसे अपने index.html में लिखेंगे:

<script src="node_modules/ng"></script>

वह पूरी स्क्रिप्ट अब पेज में लोड हो जाएगी - ताकि आप सीधे उसके चर और तरीकों तक पहुंच सकें।

अन्य दृष्टिकोण हैं जो बड़ी परियोजनाओं में अधिक व्यापक रूप से उपयोग किए जाते हैं, जैसे कि आवश्यकता के अनुसार एक मॉड्यूल लोडर । दो में से, मैंने खुद की आवश्यकता का उपयोग नहीं किया है, लेकिन मुझे लगता है कि इसे कई लोगों द्वारा जाने का तरीका माना जाता है।


आपको बस अपने प्रोजेक्ट फ़ोल्डर की जड़ में जाने की जरूरत है और npm स्थापित करें <मॉड्यूल का नाम> टाइप करें। उदाहरण के लिए यदि आप npm टाइप बूटस्ट्रैप को टाइप करते हैं तो यह बूटस्ट्रैप को नोड_मॉड्यूल्स / बूटस्ट्रैप नामक एक निर्देशिका में स्थापित कर देगा। और अब आप ऊपर बताए अनुसार अपने ऐप में बूटस्ट्रैप लोड कर सकते हैं। आपको स्पष्ट रूप से इसका उपयोग करने में सक्षम होने के लिए नोड और एनपीएम स्थापित करने की आवश्यकता होगी। यदि आपको अधिक जानकारी की आवश्यकता है तो कृपया वह त्रुटि दें जो आपको मिल रही है।
सैम रेडवे

<name of module>? यहां मेरी निर्देशिका संरचना है। रूट फ़ोल्डर है xyzxyz/index.htmlका xyz/js/scripts.jsउपयोग करने के लिए अंक script tagxyz/js/scripts.jsकोड है require('./module1.js');require('./module2.js');module1.js/ फ़ोल्डर module2.jsमें भी हैं xyz/js। अब, मैं scripts.jsब्राउज़र को कैसे उपलब्ध करूँ?
ओवरएक्सचेंज

16

आप जानते हैं कि जब आप ब्राउज़र में जावास्क्रिप्ट चला रहे होते हैं, तो आपके पास "विंडो" या गणित जैसे चर तक पहुंच होती है? आपको इन चरों को घोषित करने की आवश्यकता नहीं है, जब भी आप चाहें, उनका उपयोग करने के लिए उन्हें लिखा गया है।

खैर, जब आप Node.js वातावरण में एक फ़ाइल चला रहे हैं, तो एक चर है जिसे आप उपयोग कर सकते हैं। इसे "मॉड्यूल" कहा जाता है यह एक वस्तु है। इसकी एक संपत्ति है जिसे "निर्यात" कहा जाता है। और यह इस तरह काम करता है:

एक फ़ाइल में जिसे हम example.js नाम देंगे, आप लिखते हैं:

example.js

module.exports = "some code";

अब, आप इस स्ट्रिंग को किसी अन्य फ़ाइल में "कुछ कोड" चाहते हैं।

हम अन्य फाइल का नाम अन्यफाइल.जेएस रखेंगे

इस फ़ाइल में, आप लिखते हैं:

otherFile.js

let str = require('./example.js')

इसके लिए आवश्यक () स्टेटमेंट उस फ़ाइल में जाता है जिसे आप इसके अंदर रखते हैं, मॉड्यूल.एक्सपोर्ट प्रॉपर्टी पर जो भी डेटा संग्रहित होता है उसे ढूंढता है। लेट स्ट्रैट = ... आपके कोड के हिस्से का मतलब है कि स्टेटमेंट रिटर्न के लिए जो भी आवश्यक है, उसे स्ट्रेट वेरिएबल में स्टोर किया जाता है।

इसलिए, इस उदाहरण में, अंतिम परिणाम यह है कि otherFile.js में अब आपके पास यह है:

स्ट्रिंग = "कुछ कोड";

  • या -

let str = ('./example.js').module.exports

ध्यान दें:

फ़ाइल-नाम जो आवश्यकता कथन के अंदर लिखा गया है: यदि यह एक स्थानीय फ़ाइल है, तो यह example.js के लिए फ़ाइल-पथ होना चाहिए। इसके अलावा, .js एक्सटेंशन डिफ़ॉल्ट रूप से जोड़ा जाता है, इसलिए मुझे इसे लिखना नहीं पड़ा।

आप कुछ ऐसा ही करते हैं जब नोड की आवश्यकता होती है। पुस्तकालय, जैसे एक्सप्रेस। Express.js फ़ाइल में, 'निर्यात' नाम की एक संपत्ति के साथ 'मॉड्यूल' नाम की एक वस्तु होती है।

तो, यह इन पंक्तियों के साथ कुछ ऐसा दिखता है, हुड के नीचे (मैं कुछ हद तक शुरुआत कर रहा हूं, इसलिए इनमें से कुछ विवरण सटीक नहीं हो सकते हैं, लेकिन यह अवधारणा दिखाने के लिए है:

express.js

module.exports = function() {
    //It returns an object with all of the server methods
    return {
        listen: function(port){},
        get: function(route, function(req, res){}){}
     }
}

यदि आपको एक मॉड्यूल की आवश्यकता है, तो यह इस तरह दिखता है: const मॉड्यूलनाम = आवश्यकता ("मॉड्यूल-नाम");

यदि आपको एक स्थानीय फ़ाइल की आवश्यकता है, तो यह इस तरह दिखता है: const localFile = आवश्यकता ("./ पथ / to / local-file");

(फ़ाइल नाम की शुरुआत में सूचना दें।)


यह भी ध्यान दें कि डिफ़ॉल्ट रूप से, निर्यात एक वस्तु है .. जैसे मॉड्यूल .exports = {} तो, आप मॉड्यूल.exports.myfunction = () => {} को लिख सकते हैं। लेकिन आप मॉड्यूल.exports = "मैं अब कोई ऑब्जेक्ट नहीं हूं" लिखकर ऑब्जेक्ट को बदल सकते हैं।


6

मॉड्यूल.एक्सपोर्ट्स / आवश्यकता के दो स्वाद:

( यहां देखें )

स्वाद 1
निर्यात फ़ाइल (misc.js):

var x = 5;
var addX = function(value) {
  return value + x;
};
module.exports.x = x;
module.exports.addX = addX;

अन्य फ़ाइल:

var misc = require('./misc');
console.log("Adding %d to 10 gives us %d", misc.x, misc.addX(10));

स्वाद 2
निर्यात फ़ाइल (user.js):

var User = function(name, email) {
  this.name = name;
  this.email = email;
};
module.exports = User;

अन्य फ़ाइल:

var user = require('./user');
var u = new user();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.