मैं फ़ैंटॉमजेएस से server.listen(...)
का उपयोग कर रहा हूं। मुझे एहसास है कि यह काफी हद तक प्रयोगात्मक है और इसका उत्पादन में उपयोग नहीं किया जाना चाहिए। मैं इसे एक साधारण स्क्रीनशॉट-सर्वर के लिए उपयोग कर रहा हूं जो यूआरएल के लिए स्क्रीनशॉट उत्पन्न करता है; यह एक खिलौना प्रोजेक्ट है जिसे मैं फैंटॉमजेएस के साथ खेलने के लिए उपयोग कर रहा हूं। मैंने विशेष रूप से लंबे समय से चलने वाले अनुरोधों के साथ एक समस्या देखी है, जहां response
ऑब्जेक्ट अनुपलब्ध है। यहाँ मेरी कोड से प्रासंगिक के टुकड़े कर रहे हैं:फ़ैंटॉमजेएस: यह सुनिश्चित करना कि प्रतिक्रिया ऑब्जेक्ट सर्वर में जिंदा रहता है .listen (...)
var service = server.listen(8080, function (request, response) {
response.statusCode = 200;
if (loglevel === level.VERBOSE) {
log(request);
} else {
console.log("Incoming request with querystring:", request.url);
}
var params = parseQueryString(request.url);
if (params[screenshotOptions.ACTION] === action.SCREENSHOT) {
getScreenshot(params, function (screenshot) {
response.headers["success"] = screenshot.success; //<-- here is where I get the error that response.headers is unavailable. Execution pretty much stops at that point for that particular request.
response.headers["message"] = screenshot.message;
if (screenshot.success) {
response.write(screenshot.base64);
} else {
response.write("<html><body>There were errors!<br /><br />");
response.write(screenshot.message.replace(/\n/g, "<br />"));
response.write("</body></html>");
}
response.close();
});
} else {
response.write("<html><body><h1>Welcome to the screenshot server!</h1></body></html>")
response.close();
}
});
getScreenshot
एक अतुल्यकालिक विधि एक वेबपेज को खोलने के लिए WebPage.open(...)
समारोह का उपयोग करता है है; यह कार्य भी असीमित है। तो ऐसा प्रतीत होता है कि जब getScreenshot
को तर्क के रूप में पारित किया गया कॉलबैक अंततः कहा जाता है, तो ऐसा लगता है कि response
ऑब्जेक्ट पहले से ही हटा दिया गया है। मैं मूल रूप से PhantomJS से निम्न त्रुटि के साथ अंत:
Error: cannot access member `headers' of deleted QObject
मेरा मानना है कि इस वजह से अनुरोध समयबाह्य और इतने कनेक्शन बंद कर दिया है। दस्तावेज response.write("")
पर कॉल करने का उल्लेख करता है ताकि यह सुनिश्चित किया जा सके कि कनेक्शन खुला रहता है। मैंने server.listen(...)
की शुरुआत में response.write("")
पर कॉल करने का प्रयास किया और मैंने एक सुंदर हैकी समाधान भी कोशिश की जहां मैंने setInterval(...)
का उपयोग किया, ताकि प्रत्येक 500 मिलीसेकंड response.write("")
निष्पादित किया जा सके (मैंने इसे 50 तक कम कर दिया)। एक बार जब मैंने किया था तो अंतराल को साफ़ करना भी सुनिश्चित किया। हालांकि, मुझे अभी भी यह समस्या मिल रही है।
क्या ऐसा कुछ है जो मुझे तब तक निपटने के लिए जा रहा है जब तक वे वेबसर्वर मॉड्यूल को अधिक मजबूत न बनाते? या इसके चारों ओर एक रास्ता है?
मैंने सर्वर को निष्क्रिय रखने के लिए सर्वर को भी बदल दिया है, जो भी मदद करता है- service = server.listen (पोर्ट, {keepAlive: false}, फ़ंक्शन (अनुरोध, प्रतिक्रिया) {.... – chrismarx
आप बहुत ही अच्छे हैं। धन्यवाद अपनी समस्या को हल करने के तरीके को तोड़ना।बस एक ही मुद्दे में भाग गया। –
क्रिस की टिप्पणी ऊपर - कम से कम फ़ैंटॉमजेएस 1.9.7 के रूप में, ['keepAlive' को 'false' पर डिफ़ॉल्ट]] (https://github.com/ariya/phantomjs/blob/1.9.7/src/webserver.cpp # L116-L118)। – Whymarrh