2012-08-16 15 views
11

के साथ node.js फाइबर मैं node.js में अपना डेटाबेस कोड कम गन्दा बनाने के लिए नोड-फाइबर का उपयोग करने का तरीका जानने का प्रयास कर रहा हूं, लेकिन मैं इसे काम नहीं कर सकता।pode/postgres

var Future = require('fibers/future'); 
var pg=require('pg'); 

var connstr = "pg://not_the_real_user:[email protected]/db"; 
var pconnect = Future.wrap(pg.connect); 

Fiber(function() { 
    var client = pconnect(connstr).wait(); 
    console.log("called function"); 
}).run(); 

अगर मैं यह छोड़ना है, मैं निम्नलिखित त्रुटि मिलती है: अगर मैं लाइन है कि कॉल बाहर टिप्पणी

pgfuture.js:10 
}).run(); 
^
TypeError: undefined is not a function 
    at Object.PG.connect.pools.(anonymous function).genericPool.Pool.create (/home/erik/code/treehouse-node/node_modules/pg/lib/index.js:49:20) 
    at dispense (/home/erik/code/treehouse-node/node_modules/pg/node_modules/generic-pool/lib/generic-pool.js:223:17) 
    at Object.exports.Pool.me.acquire (/home/erik/code/treehouse-node/node_modules/pg/node_modules/generic-pool/lib/generic-pool.js:267:5) 
    at PG.connect (/home/erik/code/treehouse-node/node_modules/pg/lib/index.js:75:15) 
    at Future.wrap (/home/erik/code/treehouse-node/node_modules/fibers/future.js:30:6) 
    at /home/erik/code/treehouse-node/pgfuture.js:8:18 

हालांकि, मैं एक न्यूनतम परीक्षण मामले के रूप में इस के लिए नीचे कोड उबला हुआ pconnect, मुझे कंसोल पर "फ़ंक्शन कहा गया" संदेश मिलता है और कोई त्रुटि नहीं होती है। जिथब पेज पर उदाहरण लगभग समान संरचना है, और यह मेरे सिस्टम पर सही तरीके से काम करता है, लेकिन मैं यहां क्या गलत कर रहा हूं, इस बारे में सोच रहा हूं।

संपादित करें: अतिरिक्त विवरण

मैं दो अलग अलग तरीकों कि असंबद्ध प्रतीत में एक फैशन के बाद चलाने के लिए कोड प्राप्त करने में कामयाब रहे है, लेकिन दोनों एक ही व्यवहार किया है। समारोह खत्म होने के बाद, नोड बस लटकता है और मुझे इसे ctrl-c के साथ मारना है।

1) एक गुमनाम समारोह में pg.connect लपेटें, और फिर लपेट है कि भविष्य के साथ:

pconnect = Future.wrap(function(err,cb){pg.connect(err,cb);}); 

2) यह एक एक असली है यहाँ दो बातें मुझे लगता है कि परिणाम प्राप्त करने के किया है कर रहे हैं रहस्य, लेकिन ऐसा लगता है कि एक ही परिणाम है। फाइबर के अंदर, मैं सीधे कॉल करने के लिए कॉल से पहले pg.connect को कॉल करता हूं, और सब कुछ काम करने लगता है।

// add this line before call to pconnect 
pg.connect(connstr, function(e,c){console.log("connected.");}); 
// and now the original call to pconnect 
var client = pconnect(connstr).wait(); 

मैं एक परिस्थिति जिसमें (1) मतलब होता अगर, उदाहरण के लिए, pg.connect समारोह अन्य वैकल्पिक तर्क है कि किसी तरह Future.wrap कॉल की उम्मीद लेआउट के साथ दखल दे रहे हैं कल्पना कर सकते हैं। एक और संभावना यह है कि एक वस्तु दायरे से बाहर जा रही है और "यह" संदर्भ अनिर्धारित है जब वास्तविक कनेक्ट करने के लिए कॉल किया जाता है। मुझे समझने में कमी है कि क्यों (2) का कोई प्रभाव है।

संपादित करें: आंशिक जवाब

ठीक है, तो मैं प्रश्न के कम से कम हिस्सा जवाब दे दिया। सोचा मैं वस्तु क्षेत्र के बारे में था निकला सही होने के लिए, और बाँध() फ़ंक्शन मैं कॉलबैक रैपिंग की अतिरिक्त परत को खत्म करने में सक्षम था का उपयोग करके:

var pconnect = Future.wrap(pg.connect.bind(pg)); 

यह अभी भी के लिए निष्पादन के अंत में लटका हुआ है अज्ञात कारण हालांकि।

उत्तर

1

क्या आप निष्पादन के अंत में डेटाबेस से डिस्कनेक्ट कर रहे हैं?

यदि नहीं, तो यह node.js प्रोग्राम से बाहर निकलने से रोकता है।

0

मेरा खुद का एक और कोड जोड़ना जो लीक करता है।

@Almad मैं प्रदान की कॉलबैक के साथ यहाँ डिस्कनेक्ट करने कर रहा हूँ, लेकिन अभी भी लटकी हुई है:

var future = Future.task(function() { 
    var ret = Future.wrap (pg.connect.bind(pg), "array") (conString).wait(); 
    ret[1](); 
}).detach();