というわけで、前回の続きを延々と悩んで色々とやっていた。
なにをやっていたかは、
ここら辺を見ると判ると思いますが、なんか、試行錯誤過ぎてワロタ。
前回の記事では、TitaniumMobileのバージョンを 1.9.0 に上げるというところまでやった。
で、そのあと、サーバが Unavailable ってなってて、変だって書いたんだけど、
どうやら JSON を取りに行くたびにサーバが落ちるらしい。
node.js は、 forever という npm モジュールを使わない限り、
自動的にサーバが再起動したりしない(はず)なので、
JSONを取りに行って、サーバが処理できなくなって落ちて、
サーバが落ちたのに気づかずもう一回取りに行って、ReadyState3で止まるというわけみたい。
で、それがわかったので、サーバサイドに焦点をあてて色々やったんだけど、
まず、エラー文章を見てわかるとおり、StringBodyがなんか変だって書いてあるので、
そこをまず直した。
Google + 非公式API のnode.js のプログラムはこれ。 YungSang の美しいプログラムである。うっとり。
レスポンスを返している部分が、
function responseJSON(req, res, json) {
res.statusCode = (json.error ? json.error.code : 200);
res.charset = 'UTF-8';
res.header('cache-control',
'private, max-age=0, must-revalidate, no-transform');
var body = '';
if (typeof req.query.prettyPrint == 'undefined') {req.query.prettyPrint = true;}
if (typeof req.query.pp == 'undefined') {
req.query.pp = true;
}
if ((req.query.prettyPrint == true) && (req.query.pp == true)) {
body = JSON.stringify(json, null, ' ');
}
else {
body = JSON.stringify(json);
}
if (req.query.callback) {
res.header('Content-Type', 'text/javascript');
res.send('// API callback\n'
+ 'if (typeof ' + req.query.callback + ' == "function") '
+ req.query.callback + '(' + body + ');');
}
else {
res.header('Content-Type', 'application/json');
res.send(body);
}
こんな感じなんだけど、
ここのif(req.query.callback){}が誤動作しているのかTitaniumが悪いのか(多分Titaniumが悪い)、
TitaniumからJSONを取ろうとすると、
&callback=? としてないにもかかわらず、
JSONP、つまり、コールバックで受けようとする?のか、エラーを吐くので、
ここをまるっとコメントアウトしてやった。
つまり、
res.header('Content-Type', 'application/json');
res.send(body);
これだけになった。
で、Content-Length がないので、
res.header('Content-Type', 'application/json');
res.header('Content-Length', body.length);
res.send(body);
こんな感じにしてやると、とりあえず、エラーが収まって、データの取得(ReadyState4 200)になった。
のだが、今度は取得した JSON を JSON.parse したらエラーになる。
node.js で JSON.stringify すると、 "hoge": "huga" と ": " 余計なスペースが開くので、
これが原因か?と思ったけど、そうではないらしい。
node.js の JSON.stringify が、UTF-8 コードで文字列を返さないのが原因か?とも思ったけど、
Wassr の JSON も同様なのに動いているので、問題があるとも思えない。
というわけで、結果、お手上げでした。
んがー。悔しい。
あと、凄く動でもいい豆知識ですけど、
res.send(body);
この body って、
body = JSON.stringify(json);
json っていう {} を文字列に変換したものなんですよね。
で、
res.send(json);
という風に、javascript のオブジェクトを無理やり送信しても、
ちゃんとサーバが JSON文字列にして返してくれます。
凄く時間がかかるけど。まぁ、一応。
0 件のコメント:
コメントを投稿