1

以下のコードでは、HTTP リクエストを作成しています。応答を解析し、「トークン」(文字列) を取り出します。その値が foo に割り当てられるように、そのトークンを返したいと思います。

foo = request.post(
        {
            url: 'http://10.211.55.4/api/2.0/auth/signin',
            body: reqLogin.toString(),
            headers: {'Content-Type': 'text/xml'}
        },
        function(err, response, body) {
            if(err) {
                console.log(err);
                process.exit(1);
            } 
            else {
                parseString(body, function (err, result) {
                    tokencontainer = (result.tsResponse.credentials[0]);
                    token = tokencontainer.$.token;
                    console.log('Logged in, token is ', token);
                    return token;
                });
            }           
        }
    );

このコードを実行すると、foo のオブジェクト タイプは Request です。foo に割り当てられたリクエスト オブジェクトを取得しないように、どうにかしてリクエスト全体を「文字列」にキャストできますか? 変数に割り当てられた「トークン」値が必要なだけです。

ありがとう!

4

1 に答える 1

4

Mikeal のリクエスト ライブラリを使用している場合、.post() メソッド (またはその他のメソッド) は promise を返しません (たとえそうだったとしても、この方法でを割り当てることはできません(むしろ promise)。

したがって、オプションは次のとおりです。

  1. 「foo」を使用するロジックを別の関数に移動し、それをコールバックから呼び出します。
  2. ヘルパー ライブラリの 1 つ (Q など) を使用して、promise で .post() をラップします。
  3. promise をサポートする別の HTTP ライブラリを見つけます。

(注:上記のコードを書きましたが、実行していないため、そのままでは機能しない可能性があります。ただし、アイデアは得られます)

オプション 1 は次のようになります。

var logicUsingFoo = function(foo) {
  // do stuff with foo here
};

request.post({...}, function (err, response, body) {
  // ...
  logicUsingFoo(token);
});

// Here, you can't really use foo, because request.post() has not yet
// finished. In Javascript, there's no way to pause program execution.
// You need to either use callbacks, or promises.

オプション 2

次のようなもの ( Q ライブラリを使用):

var promisePost = function(params) {
    var q = Q.defer();

    request.post(params, function(err, response, body) {
      if (err) {
          q.reject(err);
      } else {
          q.resolve(body);
      }
    };

    return q.promise;
}

次に、それを使用します。

promisePost({url: ..., headers: ...}).then(function (body) {
  // Do stuff with body, obtain token etc.
}, function (err) {
  // Handle error
});

オプション 3

たとえば、 Kris Kowal によるQ-IOを使用できます。Kris Kowal は、promise 用に広く使用されている Q ライブラリを作成したのと同じ人物です。

于 2014-05-29T18:56:13.990 に答える