2

Meteor 1.3.2.4 でリクエスト npm パッケージを同期として使用しようとしています。

この Meteor ガイドの記事に基づいて、最初にMeteor.bindEnvironment以下のように使用してみます。

    import request from 'request';

    let result = {success: false, error: null, content: ""};
    let requestOptions = {
        url: <MY-URL-HERE>
    };

    request(requestOptions, Meteor.bindEnvironment((error, response, html) => {
        if (!error && response.statusCode == 200) {
            result.success = true;
            result.content = html;
            result.error = null;
        }
        else {
            result.success = false;
            result.content = "";
            result.error = error;
        }
    }));

しかし、それはまだ非同期呼び出しのようです。

次のステップでは、流星フォーラムのこの回答Meteor.wrapAsyncに基づいて使用しようとします。これは次の試行コードです:

        import request from 'request';

        let result = {success: false, error: null, content: ""};
        let requestOptions = {
            url: <MY-URL-HERE>
        };

        let func = function (options, callback) {
            request(options, function (error, response, body) {
                console.log("error: " + JSON.stringify(error));
                console.log("response: " + JSON.stringify(response));
                console.log("body: " + JSON.stringify(body));
                callback(error, {response, body});
            });
        };

        let {error, response, body} = syncRequest(requestOptions);

         console.log("error2: " + JSON.stringify(error));
         console.log("response2: " + JSON.stringify(response));
         console.log("body2: " + JSON.stringify(body));

        if (response.statusCode == 200) {
            result.success = true;
            result.content = body;
            result.error = null;
        }
        else {
            result.success = false;
            result.content = "";
            result.error = error;
        }

このコードは、リクエストにエラーが含まれていることを除いて正常に機能します。リクエストにエラーが含まれている場合 (たとえば、URL が正しくない)、次の例外で中断されます。

I20160518-08:24:22.180(4.5)? error: {}
I20160518-08:24:22.181(4.5)? response: undefined
I20160518-08:24:22.182(4.5)? body: undefined
W20160518-08:24:22.839(4.5)? (STDERR) TypeError: The header content contains invalid characters
W20160518-08:24:22.839(4.5)? (STDERR)     at Object.Future.wait (/home/cyc/.meteor/packages/meteor-tool/.1.3.2_4.7bk6xv++os.linux.x86_64+web.browser+web.cordova/mt-os.linux.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:420:15)
W20160518-08:24:22.839(4.5)? (STDERR)     at packages/meteor/helpers.js:119:1
W20160518-08:24:22.839(4.5)? (STDERR)     at Object.getContent (server/lib/get_content.js:51:26)
W20160518-08:24:22.839(4.5)? (STDERR)     at Object.fetch (server/lib/get_content.js:205:27)
W20160518-08:24:22.839(4.5)? (STDERR)     at Object.fetchSource (server/lib/get_content.js:369:31)
W20160518-08:24:22.840(4.5)? (STDERR)     at [object Object].action (server/controller/postsController.js:79:39)
W20160518-08:24:22.840(4.5)? (STDERR)     at [object Object].handle (packages/iron_middleware-stack/lib/handler.js:74:1)
W20160518-08:24:22.840(4.5)? (STDERR)     at boundNext (packages/iron_middleware-stack/lib/middleware_stack.js:251:1)
W20160518-08:24:22.840(4.5)? (STDERR)     at runWithEnvironment (packages/meteor/dynamics_nodejs.js:110:1)
W20160518-08:24:22.840(4.5)? (STDERR)     at packages/meteor/dynamics_nodejs.js:123:1
W20160518-08:24:22.840(4.5)? (STDERR)     - - - - -
W20160518-08:24:22.840(4.5)? (STDERR)     at ClientRequest.OutgoingMessage.setHeader (http.js:733:13)
W20160518-08:24:22.840(4.5)? (STDERR)     at new ClientRequest (http.js:1429:14)
W20160518-08:24:22.840(4.5)? (STDERR)     at Object.exports.request (http.js:1899:10)
W20160518-08:24:22.841(4.5)? (STDERR)     at Request.start (/home/cyc/Programming/Projects/content/Sources/node_modules/request/request.js:753:32)
W20160518-08:24:22.841(4.5)? (STDERR)     at Request.end (/home/cyc/Programming/Projects/content/Sources/node_modules/request/request.js:1418:10)
W20160518-08:24:22.841(4.5)? (STDERR)     at end (/home/cyc/Programming/Projects/content/Sources/node_modules/request/request.js:580:14)
W20160518-08:24:22.841(4.5)? (STDERR)     at Object._onImmediate (/home/cyc/Programming/Projects/content/Sources/node_modules/request/request.js:594:7)
W20160518-08:24:22.841(4.5)? (STDERR)     at processImmediate [as _immediateCallback] (timers.js:363:15)

今、私は2つの質問があります:

  1. 上記のコードを修正するには?
  2. このアプローチは、Meteor でリクエスト npm モジュール同期を使用する最良の方法ですか、それともより良い方法を知っていますか?
4

1 に答える 1

2

環境を縛る

Meteor.bindEnvironment元の関数を呼び出したときに使用していたコンテキストでコールバックが呼び出されるようにするだけです。コードを同期的に見せることは想定されていません。これを使用しなかった場合、コールバックはファイバー内で実行されず (一部のアクションを実行できなくなります)、特定の変数 (現在のユーザーなど) にアクセスできなくなります。これについては、 Crhis Mather による優れたビデオがあります (コードの一部は少し古くなっていますが、コアはまだ有効であることを覚えておいてください)。

非同期関数をラップする

Meteor.wrapAsyncコールバックを期待する関数を、標準のエラーの最初の 2 つの引数シグネチャでラップします。はこの正確な標準に準拠してrequestいない (3 つの引数を持つコールバックを使用する) ため、フォーラムの投稿では、前述の 2 つの引数を持つコールバックを期待する関数でラップすることを提案しました。

慣例では、「ラップされた」関数を呼び出した結果は、コールバック ( data) に渡される 2 番目の引数の値であり、エラーがある場合はエラーがスローされます。

したがって、このまま関数をtry..catchブロックでラップして、エラーがないかどうかを確認できます。

もう 1 つのオプションは、エラーを発生させないことです。

let func = function (options, callback) {
  request(options, function (error, response, body) {
    callback(null, {response, body, error});
  });
};

これは常に{response, body, error}オブジェクトになり、エラーがない場合はどこerrorになります。null

http パッケージの使用

httpcallパッケージは完全に有効であり、便利なメソッド (たとえば、一般的な、および特定のgetおよびpost)を使用してほとんど同じことを行うと思います。

例えば:

import { HTTP } from 'meteor/http';
const result = HTTP.get('https://my-url.com');
于 2016-05-31T08:21:03.043 に答える