2012-03-28 16 views
299

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

var pg = require('pg'); //native libpq bindings = `var pg = require('pg').native` 
var conString = "tcp://postgres:[email protected]/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 करना पड़ा। यह किस बारे में है? मैंने निर्देशिका में देखा और फ़ाइल पीजी नहीं मिला। इसे कहां रखा, और जावास्क्रिप्ट इसे कैसे ढूंढता है?

+14

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

+5

मैं उपरोक्त कोड कैसे बदलूं ताकि यह ब्राउज़र में काम करेगा? – neuromancer

+6

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

उत्तर

511

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

मॉड्यूल की अवधारणा <script> टैग के माध्यम से जावास्क्रिप्ट कोड की छोटी बिट जोड़ने के समान है। <script> टैग जोड़ने के विपरीत, यह फ़ाइल को वैश्विक दायरे में रिसाव नहीं करता है। फ़ाइल का अपना दायरा है, अनिवार्य रूप से उस फ़ाइल में परिभाषित सब कुछ फँसाना, जब तक आप कार्यक्षमता का पर्दाफाश करने का निर्णय नहीं लेते। requireexports या module.exports का उपयोग करके मॉड्यूल का खुलासा करने के आधार पर एक मान देता है। Another post बताता है कि require()exports के साथ संयोजन में कैसे काम करता है।  

अपने कोड में, यह pg मॉड्यूल लोड करता है, जो मुझे लगता है कि नोडजेएस के लिए एक PostgreSQL ड्राइवर है। वह हिस्सा जहां आप npm install pgpg मॉड्यूल को एनपीएम (नोडजेएस मॉड्यूल के लिए एक पैकेज रिपोजिटरी) डाउनलोड करते हैं और इसे require('pg'); के माध्यम से आपके प्रोजेक्ट में उपलब्ध कराते हैं।


बस मामले में आप सोच रहे थे क्यों मैंने कहा "अपने प्रश्न का संदर्भ में", वहाँ वह भी require नामित कुछ करने के लिए एक समारोह का उपयोग 3 पक्ष के पुस्तकालयों रहे हैं। यह पहचानने के लिए आसान है कि कौन सा है।

  • RequireJS प्रदान की कोड को चलाने से पहले निर्भरता लोड करने के लिए एक समारोह require कहा जाता है को उजागर करता है, define के साथ। वाक्यविन्यास एएमडी प्रारूप में है।

  • Neuter, जो जेएस फाइलों को जोड़ता है, require नामक फ़ंक्शन का खुलासा करता है। यह PHP के import के बहुत करीब काम करता है।

  • Browserify ब्राउज़र पर require का उपयोग करता है, ब्राउज़र पर लिपियों को नोडजेएस शैली (कॉमनजेएस मॉड्यूल सिंटैक्स) लिखा जा सकता है।

+9

मुझे लगता है कि [वेबपैक में भी अपना 'आवश्यकता' समर्थन है] (https://webpack.github.io/docs/context.html)? –

+0

Node.js को इस कार्यक्षमता की आवश्यकता क्यों होगी? – Melab

+3

@ मेलाब क्योंकि कोड कोड गुब्बारे को कोड कोडिंग अभ्यास से बड़ा कुछ करने के लिए मॉड्यूलरलाइजेशन की आवश्यकता होती है और 1 से अधिक व्यक्ति को शामिल करना शुरू होता है। कौन सा है [हम हमेशा के लिए क्यों, हमेशा के लिए उपयोग कर रहे हैं] (https://en.wikipedia.org/wiki/Mesa_ (प्रोग्रामिंग_भाषा))। –

25

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

फ़ाइल 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 
+4

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

+1

मैं ऊपर दिए गए वेब पेज में लोड करने की कोशिश कर रहा हूं! – neuromancer

+6

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

82

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

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

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

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

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

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

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

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

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

+0

और 'एक्सप्रेस' क्या है ... जब मैं 'एक्सप्रेस' नामक फ़ाइल या निर्देशिका के लिए 'सी: \ प्रोग्राम फ़ाइलें \ nodejs \' में खोज करता हूं, तो मुझे कोई मिलान नहीं मिलता है ... तो यह कहां से आता है ... – dsdsdsdsd

+1

एक्सप्रेस एक संग्रह है मिडलवेयर और ढांचे का जो नोड.जेएस में वेब सर्वर बनाना आसान बनाता है, आपको इसे 'एनपीएम' के साथ स्थापित करने की आवश्यकता होगी। आप यहां अधिक जानकारी प्राप्त कर सकते हैं: http://expressjs.com/ –

10

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

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

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

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

कि - तो आप इसके चर और विधियों को सीधे एक्सेस कर सकते हैं।

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

+0

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

+0

'<मॉड्यूल का नाम>'? यहां मेरी निर्देशिका संरचना है। रूट फ़ोल्डर 'xyz' है। 'xyz/index.html'' स्क्रिप्ट टैग 'का उपयोग करके 'xyz/js/scripts.js' को इंगित करता है। 'xyz/js/scripts.js' में कोड की आवश्यकता है ('./ module1.js'); आवश्यकता है ('./ module2.js');'। 'module1.js' /' module2.js' भी 'xyz/js' फ़ोल्डर में हैं। अब, मैं ब्राउज़र पर 'scripts.js' कैसे उपलब्ध करूं? – overexchange

संबंधित मुद्दे