2017-10-31 14 views
0

私はPOSTリクエストを作成しています。要求が成功した場合、私はCisco Sparkチャットルームを作成しています(スラックに似ています)。 POST要求の中で、私はPOST要求成功の中の変数(配列)の一部と、Cisco Sparkチャットルームの作成成功の中の変数の他の部分を更新しています。request.postでネストされた約束

ここでは、必要なときに変数全体を使用できるように、ここではネストされた約束が必要だと思います。しかし、私はこれを行う方法がわかりません。

元のコードは以下のようになります。

var request = require('request'); 
var array = []; 
    myObj = new Object() 
    request.post({ 
      url: urlServiceNow, 
      headers: headers, 
      rejectUnauthorized: false, 
      requestCert: false, 
      agent: false, 
     },function (response, err, body){ 
      var createJSON = JSON.parse(body); 
      array.push(createJSON.result.sys_id); 
     }.bind(this)); 
    ciscospark.rooms.create({title: `AppDNotification`}) 
     .then((room) => { 
     array.push(room.id) 
     myObj[valEventTime] = array; 
     imdb.push(myObj) 
     return Promise.all([ 
      //more code 
     ]).catch((error) => { 
      console.log(`Error: \n${error}`); 
     }) 
     .then(() => ciscospark.messages.create({ 
      markdown: messageToSend, 
      roomId: room.id 
      })) 
      .catch((error) => { 
      console.log(`Error: \n${error}`); 
     }); 
     }); 

私は

request.post({ 
     url: urlServiceNow, 
     headers: headers, 
     rejectUnauthorized: false, 
     requestCert: false, 
     agent: false, 
    },function (response, err, body){ 
     var createJSON = JSON.parse(body); 
     array.push(createJSON.result.sys_id); 
    }.bind(this)) 
    .then(() => ciscospark.rooms.create({title: `AppDNotification`})) 
    .then((room) => { 

     //rest of the code 
    }) 

以下のように.bind後.thenでコードを更新しました。しかし、私はエラー

TypeError: request.post(...).then is not a function 
を取得しています

お勧めします。要求のドキュメントを見てみると

+0

どのようなリクエストライブラリを使用していますか? '要求 'が何であるかは明確ではない。それはネイティブなnode.jsオブジェクトですか、[request](https://github.com/request/request)を使用していますか? – zero298

+0

は投稿を編集しました。私はvar request = require( 'request')を使用しています。 – nad

+0

そのライブラリのドキュメントを見てください。このライブラリを使用した約束は、[Promises&Async/Await](https://github.com/request/request#promises--asyncawait)ではサポートされていません。 [request-promise](https://github.com/request/request-promise)などのラッピングライブラリの使用を検討する必要があります。 – zero298

答えて

2

promises are not supported

要求は、ストリーミングとネイティブコールバックインターフェイスの両方をサポートしています。代わりにプロミスを返すようにしたい場合は、別のインターフェイスラッパーを使用してリクエストできます。これらのラッパーは、Promisesを使用したい場合、またはES2017でasync/awaitを使用する場合に便利です。

ドキュメントは約束をサポートしていますいくつかの異なるバージョンのいずれかを使用することをお勧めするように続きます

request-promise(ブルーバード約束を使用しています)
request-promise-nativeは(ネイティブの約束を使用しています)
request-promise-any(いずれかを使用しています - プロミス約束)

0

解決済みrequest-promise

var rp = require('request-promise'); 

// Configure the POST request 
var optionsPOST = { 
    url: urlServiceNow, 
    method : 'POST', 
    headers : headers, 
    rejectUnauthorized: false, 
    requestCert: false, 
    agent: false 
} 

rp(optionsPOST) 
    .then(function (parsedBody) { 
     var post = JSON.parse(parsedBody); 
     console.log(post) 
     console.log(post.result.sys_id) 
     ciscospark.rooms.create({title: `AppDNotification`}) 
      .then((room) => { 

      return Promise.all([ 
       ciscospark.memberships.create({ 
       roomId: room.id, 
       personEmail: `[email protected]` 
       }), 
       ciscospark.memberships.create({ 
       roomId: room.id, 
       personEmail: `[email protected]` 
       }), 
      ]).catch((error) => { 

       //Handle Error Here 
       console.log(`Error: \n${error}`); 

      }) 
      .then(() => ciscospark.messages.create({ 
       markdown: "Hi", 
       roomId: room.id 
       })) 
       .catch((error) => { 
       console.log(`Error: \n${error}`); 
      }); 
      }); 
    }) 
    .catch(function (err) { 
     console.log("fail") 
    }); 
関連する問題