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(...)
関数を使用してWebページを開く非同期メソッドです。この関数も非同期です。したがって、発生しているように見えるのは、引数として渡されたコールバックgetScreenshot
が最終的に呼び出されたときに、response
オブジェクトがすでに削除されているように見えることです。基本的に、PhantomJSから次のエラーが発生します。
Error: cannot access member `headers' of deleted QObject
これは、リクエストがタイムアウトして接続が閉じられたためだと思います。response.write("")
ドキュメントには、接続を開いたままにするために少なくとも1回呼び出すことが記載されています。私response.write("")
は最初に電話をかけてみましたが、500ミリ秒ごとに実行してserver.listen(...)
いたかなりハッキーなソリューションも試しました(50ミリ秒まで下げました)。また、終わったら必ずインターバルをクリアしました。しかし、私はまだこの問題を抱えているようです。setInterval(...)
response.write("")
これは、Webサーバーモジュールがより堅牢になるまで対処しなければならないことですか?それともそれを回避する方法はありますか?