Viv*_*ath 6 javascript phantomjs
我正在使用server.listen(...)PhantomJS.我意识到它主要是实验性的,不应该用于生产.我将它用于一个简单的屏幕截图服务器,它接受生成URL的屏幕截图; 这是我用来玩PhantomJS的玩具项目.我注意到特别是长时间运行的请求存在问题,其中response对象不可用.以下是我的代码中的相关代码段:
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();
}
});
Run Code Online (Sandbox Code Playgroud)
getScreenshot是一个使用该WebPage.open(...)函数打开网页的异步方法; 这个函数也是异步的.所以似乎正在发生的事情是,当getScreenshot最终调用作为参数传入的回调时,似乎该response对象已被删除.我基本上最终得到了PhantomJS的以下错误:
Error: cannot access member `headers' of deleted QObject
Run Code Online (Sandbox Code Playgroud)
我相信这是因为请求超时,因此连接已关闭.该文档提到response.write("")至少调用一次以确保连接保持打开状态.我尝试response.write("")在开始时调用,server.listen(...)我甚至尝试了一个非常hacky的解决方案,我曾经每500毫秒setInterval(...)执行response.write("")一次(我甚至将它降低到50).一旦完成,我也确保清除间隔.但是,我似乎仍然遇到这个问题.
这是我必须要处理的事情,直到它们使网络服务器模块更加健壮吗?或者有办法吗?
我能够弄清楚这一点.看来,在加载WebPage.open(例如http://fark.com和http://cnn.com)多个onLoadFinished事件的某些页面时会触发.这导致WebPage.open多次调用回调.那么当控制回到调用函数时,我已经关闭了响应,因此response对象不再有效.我通过在WebPage.open调用函数之前使用创建标志来修复此问题.在回调中,我检查标志的状态,看看我是否已经遇到过上一个onLoadFinished事件.一旦我在WebPage.open回调中处理了我必须做的任何事情,我就会更新标志以显示我已完成处理.这种方式虚假(至少在我的代码的上下文中)onLoadFinished事件不再被服务.