ktty1220 / cheerio-httpcli

iconvによる文字コード変換とcheerioによるHTMLパースを組み込んだNode.js用HTTPクライアントモジュール
MIT License
262 stars 28 forks source link

fetchSyncを使うとエラーが発生します。 #14

Closed rluisr closed 8 years ago

rluisr commented 8 years ago

内容

上記環境において下記のようなコードを実行すると

SyntaxError: Unexpected end of JSON input

が吐き出される。

fetchSync → fetch に変更するとこのエラーは発生しません。

該当コード

const client = require('cheerio-httpcli');
const url = 'http://hoge.com/';

var result1 = client.fetch(url);
console.log(result1);
ktty1220 commented 8 years ago

確認1

エラーメッセージの他にスタックトレース情報が出力されている場合はそれも教えてもらってよろしいでしょうか。 (どのファイルの何行目でエラーが発生、といった情報)

確認2

以下のようにデバッグオプションをONにするとコンソールにデバッグ情報が表示されますが、その内容を差しつかえない範囲で見せてもらってよろしいでしょうか。

const client = require('cheerio-httpcli');

// 以下を追加
client.debug = true;

const url = 'http://hoge.com/';

var result1 = client.fetch(url);
console.log(result1);

確認3

他のURLを指定してfetchSyncしても同じ状況になりますか?

ktty1220 commented 8 years ago

すみません、追加でもう1つ

確認4

GETパラメータやURLに生の日本語が入っていたりしますか?

rluisr commented 8 years ago

@ktty1220

現在、外出先でWindows環境ではなくMacでまた違う挙動をしました。 (Windowsでの問題と思われる今回の件については夜にお知らせします)

内容

Electron + fetchSync の組み合わせで client.debug = trueを有効にすると

fetchSync

> rluisr@1.0.0 build /Users/luis/IdeaProjects/electron_yukari
> electron .

[DEBUG]: 
  uri:     http://www.tamurayukari.com/
  method:  GET
  headers: 
    Host:       www.tamurayukari.com
    User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
    Accept:     text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

ここで出力が止まってしまいます。

fetchにするとelectronでのブラウザも立ち上がり出力がされます。

fetch

> rluisr@1.0.0 build /Users/luis/IdeaProjects/electron_yukari
> electron .

[DEBUG]: 
  uri:     http://www.tamurayukari.com/
  method:  GET
  headers: 
    Host:       www.tamurayukari.com
    User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
    Accept:     text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

lib$rsvp$promise$$Promise {
  _id: 0,
  _label: undefined,
  _state: undefined,
  _result: undefined,
  _subscribers: [] }

今回用いたコードは下記になります。

const client = require('cheerio-httpcli');
const {app, BrowserWindow} = require('electron');

client.debug = true;

var result1 = client.fetchSync('http://www.tamurayukari.com/');
//var result1 = client.fetch('http://www.tamurayukari.com/');
console.log(result1);

app.on('ready', () => {
    mainWindow = new BrowserWindow({
    height: 600,
    width: 800,
    frame: false
});

mainWindow.loadURL('file://' + __dirname + '/index.html');
});
ktty1220 commented 8 years ago

Macの件について

fetchSyncは現在スクリプトを実行しているプロセスのprocess.execPathを使用して別スクリプトを起動し、標準入力経由でパラメータを渡し、その結果を標準出力経由で受け取るという形で実装しています。

Node.jsから実行した場合はprocess.execPath/path/to/nodeといったNode.jsのパスが入りますが、Electronの場合は/path/to/electronといったElectronのパスが入ります。

fetchSyncで実行する別スクリプトはNode.jsから起動されることを前提としているので、Electronからだと正常に動作しないという感じになっています。

環境変数PATHを見てnodeがあればそれを使って実行という手もありますが、そのnodeが本当にNode.jsなのかという保証がありません。 たまたまPATHにあった得体のしれないnodeという名前のプログラムを実行して何かおかしなことが起こるというリスクを考えるとこの対策はちょっと無理そうです。

※そもそもせっかくElectronでアプリ化しているのに別途Node.jsのインストールが必要というのもおかしな話な気がします。

なので、ElectronからはSync系のメソッドは使用できないと思います。ご了承ください。

※次のバージョンで、Electron上でSync系メソッドを実行しようとしたらエラーにする対応を入れる予定です。

備考

Electronにcheerio-httpcliをのせるためにwebpackしたらいろいろエラーがでたり、エラーを解消しても大量にWarningが残ったので、Sync系メソッド以外は正常に動作するかというとそれも分かりません。 ※見た感じ、Promise系も怪しい感じがします。

あらかじめご留意の程を。

rluisr commented 8 years ago

@ktty1220 さん

親切に対応してくださって感謝しております。 そういった背景があったのですね。

今はasyncを使って力技で動かしています。

Windowsの件に関してはnode_modulesを一旦削除しnpm installと、Node.jsのバージョンを4.4.7にしたところエラーは無くなりました。

情報量が少なすぎて申し訳ありません。

ktty1220 commented 8 years ago

Windowsの方はとりあえず動作したようで何よりです。

また何か不具合など発生したらお知らせいただければと思います。 こちらは一旦closeします。