我正在使用PhantomJS中的server.listen(...)
。我意识到这在很大程度上是试验性的,并且不应该在生产中使用。我正在使用它来创建一个简单的截图服务器,用于为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();
}
});
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
。 - Whymarrh