gpt4 book ai didi

javascript - PhantomJS:确保响应对象在 server.listen(...) 中保持事件状态

转载 作者:数据小太阳 更新时间:2023-10-29 05:13:17 27 4
gpt4 key购买 nike

我正在使用来自 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("") ,我什至尝试了一个非常 hacky 的解决方案,我使用了 setInterval(...) 每 500 毫秒执行一次 response.write("")(我什至将它降低到 50)。我还确保在完成后清除间隔。但是,我似乎仍然遇到这个问题。

在他们使网络服务器模块更加健壮之前,这是我必须要处理的事情吗?或者有解决办法吗?

最佳答案

我能够弄清楚这一点。似乎在使用 WebPage.open 加载某些页面时(例如 http://fark.comhttp://cnn.com ) 多个 onLoadFinished 事件被触发。这导致 WebPage.open 中的回调被多次调用。所以发生的事情是,当控制权返回到调用函数时,我已经关闭了响应,因此 response 对象不再有效。我通过在调用 WebPage.open 函数之前创建一个标志来修复此问题。在回调中,我检查标志的状态以查看我是否已经遇到了之前的 onLoadFinished 事件。一旦我在 WebPage.open 回调中完成了我必须做的任何事情,我就会更新标志以表明我已经完成处理。这样虚假的(至少在我的代码的上下文中)onLoadFinished 事件不再被服务。

关于javascript - PhantomJS:确保响应对象在 server.listen(...) 中保持事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11597990/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com