我正在使用PhantomJS中的server.listen(...)
。我意識到它主要是實驗性的,它不應該用於生產。我將它用於一個簡單的截圖服務器,它接受爲URL生成屏幕截圖;這是一個我用來和PhantomJS一起玩的玩具項目。我注意到長期運行的請求的問題,特別是在response
對象不可用的情況下。下面是我的代碼中的相關片段:PhantomJS:確保響應對象在server.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)。我完成後一定要清除間隔。不過,我似乎仍然遇到這個問題。
這是我不得不處理的東西,直到他們使webserver模塊更強大?或者有沒有辦法解決它?
我也將服務器keepalive更改爲false,這似乎也有幫助 - service = server.listen(port,{keepAlive:false},function(request,response){.... – chrismarx 2012-10-03 02:00:24
您真棒。打破你如何解決你的問題。剛剛遇到同樣的問題。 – 2012-12-30 01:24:12
回覆Chris的評論 - 至少在PhantomJS 1.9.7中,['keepAlive'默認爲'false'](https://github.com/ariya/phantomjs/blob/1.9.7/src/webserver.cpp #L116-L118)。 – Whymarrh 2014-05-29 01:10:33