1

Meteor を使用してサーバー側のルートを介して Rserve サーバーにアクセスし、R コードを呼び出そうとしています。Rserve へのアクセスを可能にする Node.js モジュールはnode-rioです。 meteorhacks:npm Meteor パッケージの Async.wrap 関数を使用して、「評価」メソッドをラップしました。ブラウザでルート パス「/rio」にアクセスしようとすると、コンソール ログに「1」が書き込まれます。これは、R のコマンド「1」の評価としては正しいのですが、Chrome は「Waiting」というメッセージでハングします。ローカルホスト用」。次の行に進まず、「Result: 1」が表示されることはありません。「net::ERR_EMPTY_RESPONSE」というメッセージが最終的に Chrome に表示されます。

Router.route('/rio', function() {
    var rio = Meteor.npmRequire('rio');
    var evalSync = Async.wrap(rio, 'evaluate');
    var result = evalSync('1');
    console.log("Result: " + result);

    // JSON
    this.response.writeHead(200, {'Content-Type': 'application/json'});
    this.response.end(result);
}, {
    where: 'server'
});

「評価」にはコールバック関数のパラメーターがありますが、オプションのパラメーターにラップされてアクセスされます。

rio.evaluate(R_COMMAND, {callback: CALLBACK_FUNCTION})
4

2 に答える 2

0

この回答は、'packageVersion("base")' に対して期待される結果を生成します。これは、rio の代わりに Node モジュールrserve-clientを使用して Rserve に接続します。ルートはパラメータ「pkg」も処理します。これは、私を正しい方向に向けた StackOverflow の質問です。

Meteor 独自のコールバックから非同期メソッドを呼び出す方法は?

Router.route('rserve', {
    path: '/rserve/:pkg',
    where: 'server',
    action:  function() {
        var r = Meteor.npmRequire("rserve-client");
        var Future = Meteor.npmRequire("fibers/future");
        var fut = new Future();

        var cmd = 'packageVersion("' + this.params.pkg + '")';

        var callR = function (input) {
            r.connect('127.0.0.1', 6311, function (err, client) {
                client.evaluate(input, function (err, ans) {
                    console.log("Result: " + ans);
                    client.end();

                    fut.return(ans);
                });
            });

            return fut.wait();
        };

        var result = callR(cmd);

        this.response.writeHead(200, {'Content-Type': 'application/json'});
        this.response.end(JSON.stringify(result));
    }
});
于 2015-05-17T13:55:38.167 に答える