2015-02-27 13 views
6

नोड.जेएस प्रोजेक्ट में लूपबैकजेएस के साथ निर्मित करने के लिए मुझे अनुरोध के दौरान डेटा स्टोर करने की आवश्यकता है।Node.js process.domain कभी-कभी

// pre-processing middleware 
app.use(function (req, res, next) { 
    // create per request domain instance 
    var domain = require('domain').create(); 

    // save request and response to domain, to make it accessible everywhere 
    domain.req = req; 
    domain.res = res; 
    domain.run(next); 
}); 

आवश्यक मॉड्यूल में बाद में:

तो मैं domain सुविधा का उपयोग किया

Model.beforeRemote('**', function(oContext, oModel, next) { 
    // Save method name for later use 
    process.domain.remoteContext = {   /* Here is an error thrown */ 
     methodName: oContext.method.name 
    }; 
    ... 
    process.domain.res.send() // example of usage 
}) 

लेकिन जब मैं सफारी या IE से अनुरोध करते हैं, process.domain कभी कभी अपरिभाषित है! क्रोम या फ़ायरफ़ॉक्स से अनुरोध करना अपेक्षित काम करता है। कोई सुझाव?

त्रुटि प्रतिक्रिया:

{"error":{"name":"TypeError","status":500,"message":"Cannot set property 'remoteContext' of undefined","stack":"TypeError: Cannot set property 'remoteContext' of undefined\n at module.exports (/Users/igormatyushkin/projects/Yash/server/hooks/admin-remote.js:12:34)\n at Function.Model.setup.ModelCtor.beforeRemote.args (/Users/igormatyushkin/projects/Yash/node_modules/loopback/lib/model.js:184:9)\n at execStack (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/lib/remote-objects.js:363:13)\n at RemoteObjects.execHooks (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/lib/remote-objects.js:372:10)\n at RemoteObjects.invokeMethodInContext (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/lib/remote-objects.js:512:8)\n at async.series.results (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/node_modules/async/lib/async.js:610:21)\n at _asyncMap (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/node_modules/async/lib/async.js:249:17)\n at async.eachSeries.iterate (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/node_modules/async/lib/async.js:149:13)\n at async.eachSeries (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/node_modules/async/lib/async.js:165:9)\n at _asyncMap (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/node_modules/async/lib/async.js:248:13)"}} 
+0

क्या आप हमें वह कोड दिखा सकते हैं जहां डोमेन अपरिभाषित है? क्या आप उसी क्षेत्र से डोमेन तक पहुंच रहे हैं जहां आपने इसे परिभाषित किया था? आपके कोड उदाहरण में, आप वास्तव में प्रक्रिया में डोमेन को संलग्न नहीं कर रहे हैं - मुझे लगता है कि आप अपने कोड में कहीं और ऐसा करते हैं?इसके अलावा, कृपया अवांछित त्रुटि के लिए अग्रणी स्टैक ट्रेस पोस्ट करें, इसमें एक सुराग या दो हो सकते हैं। –

+0

@RobertRossmann, मैंने कोड अपडेट किया और फेंक दिया त्रुटि जोड़ा। 'Process.domain' को नोड द्वारा प्रारंभ किया जाता है, जब' domain.run() 'कहा जाता है और मैं अन्य आवश्यक मॉड्यूल में बाद में 'process.domain.remoteContext' तक पहुंचता हूं। – IvanZh

उत्तर

2

बस पता चला कि रचनात्मकता बाध्यकारी req और सृजन पल में डोमेन के लिए res, निष्पादन ढेर में अपरिभाषित डोमेन को हल करता है।

app.use(function (req, res, next) { 
    // create per request domain instance 
    domain.create().run(function() { 
    // explicit binding 
    process.domain.add(req) 
    process.domain.add(res) 
    // save request to domain, to make it accessible everywhere 
    process.domain.req = req; 
    process.domain.res = res; 
    next() 
    }); 
}); 

कि ऐसा क्यों होता है पता नहीं है, इसलिए मैं अन्य संभावित सलाह के लिए खुला प्रश्न छोड़ दें।

1

ऐसा नहीं है कि उल्लेख के लायक है are not meant to be used to handle errors in this manner डोमेन। डोमेन का उपयोग पूरे एप्लिकेशन के मॉड्यूल को सुरक्षित रूप से क्रैश करने की अनुमति देने के लिए किया जाता है (उदाहरण के लिए, शायद आप सैंडबॉक्स में तीसरे पक्ष कोड को चलाने के लिए चाहते हैं)। यहां एक डोमेन आवश्यक नहीं है (हालांकि आप निश्चित रूप से, एक का उपयोग करने के लिए स्वतंत्र हैं)

इसके अलावा, process.domain केवल तभी सेट किया गया है जब दिया गया कार्य डोमेन स्टैक के भीतर से निष्पादित हो रहा हो। आप मॉडल की कॉल साइट के बारे में जानकारी प्रदान नहीं करते हैं, इसलिए मैं केवल यह मान सकता हूं कि इस मॉडल के बाहर से आपका मॉडल बुलाया जा रहा है, जो त्रुटि उत्पन्न कर रहा है।

यह देखते हुए कि आप beforeRemote, जो कार्यान्वित से पहले एक दूरस्थ कार्रवाई निष्पादित किया जाता है, मैं डोमेन ढेर के बाहर से बुलाया जा रहा है कि ग्रहण करने के लिए जा रहा हूँ, और इस तरह process.domain अपरिभाषित जा रहा है उम्मीद है व्यवहार करने के लिए hooking रहे हैं।

+0

मान लें कि प्रक्रिया.डोमेन कॉल स्टैक से गुम है, लेकिन यह तब होता है जब मैं सफारी या आईई से अनुरोध करता हूं। क्रोम या फ़ायरफ़ॉक्स से अनुरोध करना अपेक्षित काम करता है। – IvanZh

+0

आपके प्रश्न में यह उल्लेख नहीं किया गया था कि आपने क्रोम या फ़ायरफ़ॉक्स के साथ प्रयास किया था, यही कारण है कि मैंने धारणा की - केवल सफारी और आईई में आपने कोशिश की थी। –

1

इस प्रश्न के पाठक के लिए यह जानना महत्वपूर्ण है कि Node's Domain module को बहिष्कृत किया गया है और इसका उपयोग नहीं किया जाना चाहिए।

यदि आप यहां इस समस्या का समाधान ढूंढ रहे हैं तो आप डोमेन मॉड्यूल के अलावा कुछ और ढूंढने के लिए बेहतर होंगे।

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

हालांकि यह तकनीकी रूप से ओपी के प्रश्न का उत्तर नहीं देता है, मुझे विश्वास है कि यह इस प्रश्न के अधिकांश पाठकों के लिए सही "समाधान" है।

डोमेन का उपयोग करने का एक विकल्प continuation-local-storage मॉड्यूल है।