Closed rluisr closed 8 years ago
エラーメッセージの他にスタックトレース情報が出力されている場合はそれも教えてもらってよろしいでしょうか。 (どのファイルの何行目でエラーが発生、といった情報)
以下のようにデバッグオプションをONにするとコンソールにデバッグ情報が表示されますが、その内容を差しつかえない範囲で見せてもらってよろしいでしょうか。
const client = require('cheerio-httpcli');
// 以下を追加
client.debug = true;
const url = 'http://hoge.com/';
var result1 = client.fetch(url);
console.log(result1);
他のURLを指定してfetchSyncしても同じ状況になりますか?
すみません、追加でもう1つ
GETパラメータやURLに生の日本語が入っていたりしますか?
@ktty1220
現在、外出先でWindows環境ではなくMacでまた違う挙動をしました。 (Windowsでの問題と思われる今回の件については夜にお知らせします)
Electron + fetchSync の組み合わせで client.debug = true
を有効にすると
> 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でのブラウザも立ち上がり出力がされます。
> 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');
});
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系も怪しい感じがします。
あらかじめご留意の程を。
@ktty1220 さん
親切に対応してくださって感謝しております。 そういった背景があったのですね。
今はasyncを使って力技で動かしています。
Windowsの件に関してはnode_modulesを一旦削除しnpm install
と、Node.jsのバージョンを4.4.7にしたところエラーは無くなりました。
情報量が少なすぎて申し訳ありません。
Windowsの方はとりあえず動作したようで何よりです。
また何か不具合など発生したらお知らせいただければと思います。 こちらは一旦closeします。
内容
上記環境において下記のようなコードを実行すると
が吐き出される。
fetchSync → fetch に変更するとこのエラーは発生しません。
該当コード