Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
rluisr opened this issue Jul 5, 2016 · 6 comments
Closed

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

rluisr opened this issue Jul 5, 2016 · 6 comments

Comments

@rluisr
Copy link

rluisr commented Jul 5, 2016

内容

  • Windows 10
  • Node 6.2.2
  • npm 3.9.5

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

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
Copy link
Owner

ktty1220 commented Jul 5, 2016

確認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
Copy link
Owner

ktty1220 commented Jul 5, 2016

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

確認4

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

@rluisr
Copy link
Author

rluisr commented Jul 6, 2016

@ktty1220

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

内容

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

fetchSync

> [email protected] 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

> [email protected] 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
Copy link
Owner

ktty1220 commented Jul 6, 2016

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
Copy link
Author

rluisr commented Jul 7, 2016

@ktty1220 さん

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

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

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

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

@ktty1220
Copy link
Owner

ktty1220 commented Jul 9, 2016

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

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

@ktty1220 ktty1220 closed this as completed Jul 9, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants