1

これが問題です:サーバーにデータを送信するクライアントがあります。このサーバーは外部 API に接続し、その応答をクライアントに送り返す必要があります。サーバーがクライアント データを取得した後、外部 API に接続する方法と場所がわかりません。

私はこのようにクライアントデータをルーティングします:

app.post('/getAutoComplete', routes.read);

routes.read は req.body 内のデータを取得します。私のnodejsバージョン(エクスプレスフレームワークなし)では、次のようにAPIをリクエストします:

var http = require('http'), options = {
        host : "192.168.1.38",
        port : 8080,
        path : "/myURL",
        method : 'POST'
};

var webservice_data = "";

var webservice_request = http.request(options, function(webservice_response)
{
    webservice_response.on('error', function(e){ console.log(e.message); });
    webservice_response.on('data', function(chunk){ webservice_data += chunk;});
    webservice_response.on('end', function(){res.send(webservice_data);});
});

webservice_request.write(req.body);
webservice_request.end();

問題は、app.post のようなネイティブの expressJS メソッドを使用したいのですが、次の理由で方法がわかりません。

  1. Express (アプリ) オブジェクトはここでは使用できません (app.js で宣言されていますが、ルート ファイルでは宣言されていません)
  2. app.post で POST データを送信する方法がわかりません

なにか提案を ?

4

2 に答える 2

2
app.post('/getAutoComplete', routes.read);
// assuming routes.read lookes something like this
routes.read = function read(req, res) {
  var http = require('http'), options = {
          host : "192.168.1.38",
          port : 8080,
          path : "/myURL",
          method : 'POST'
  };

  var webservice_data = "";

  var webservice_request = http.request(options, function(webservice_response)
  {
      webservice_response.on('error', function(e){ console.log(e.message); });
      webservice_response.on('data', function(chunk){ webservice_data += chunk;});
      webservice_response.on('end', function(){res.send(webservice_data);});
  });

  webservice_request.write(req.body);
  webservice_request.end();
};

また、 https://github.com/mikeal/requestもチェックしてください。 これは、ノードで Web リクエストを実行するための事実上のモジュールです。

于 2012-04-20T07:36:40.217 に答える
0

routes.read関数です。追加のパラメーターを使用して呼び出すことができるため、たとえば

app.post('/getAutoComplete', function(req,res) {
    var q = req.query.q;  // or whatever data you need
    routes.read(q, function(err, response) {
        if (err) throw err;
        return res.json(response);
    });
});

次に、routes.read関数で最初のパラメーターをクエリとして使用し、リモート API からの応答を収集したら、最初のパラメーターとしてエラーを指定して 2 番目のパラメーターを呼び出し、2 番目のパラメーターとして応答を呼び出します。

更新この回答はすでに回答として選択されていますが、routes.read の例も示した方が役に立ちます。

routes.read = function(q, cb) {
    // pretend we calculate the result
    var result = q * 10;
    if (result > 100) {
        // call the callback with error set
        return cb("q value too high");
    }
    // all is well, use setTimeout to demonstrate
    // an asynchronous return
    setTimeout(function() { cb(null, result) }, 2000);
};
于 2012-04-20T04:15:08.313 に答える