我正在使用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();
}
});
getScreenshot
是使用WebPage.open(...)
函数打开网页的异步方法;这个函数也是异步的。所以似乎正在发生的是,当作为参数传入的回调getScreenshot
最终被调用时,似乎该response
对象已被删除。我基本上以 PhantomJS 的以下错误结束:
Error: cannot access member `headers' of deleted QObject
我相信这是因为请求超时,因此连接已关闭。该文档提到response.write("")
至少调用一次以确保连接保持打开状态。response.write("")
我尝试在开始时调用,server.listen(...)
我什至尝试了一个非常 hacky 的解决方案,我曾经每 500 毫秒setInterval(...)
执行response.write("")
一次(我什至将它降低到低至 50)。完成后,我还确保清除间隔。但是,我似乎仍然遇到这个问题。
在他们使 webserver 模块更健壮之前,这是我必须处理的事情吗?或者有没有办法解决它?