質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

2回答

1830閲覧

node.js 受け取った値を次の処理に回す方法

blossan

総合スコア154

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2016/12/14 02:21

御世話になります。

node.jsのpost通信について質問します。
apiを利用する際に、ユーザー名とパスワードをapi側のサイトに通信すると、今後その他のapiが使えるように認証キーを渡してくれます。

同期処理の場合

1:認証を通すコード
2:認証で受け取った認証キーでapiを動かすコード

このように順々にコードを書き動かすことが出来ます。
しかし、node.jsの非同期処理の書き方で、どのように認証が終わった後に、その値を利用してapiの通信をすればよいかよくわかりません。

順々にコードを書いたnode.jsが以下になりうまく起動しません。
その原因が、認証を通した apikey,token を次のapi通信に渡せていないと考えています。
エラーでも、指定した apikey,token に問題があると指摘しています。

どのような書き方をすればよいかを教えてください。

node.js

1 2 //認証を通すコード 3 //ヘッダーを定義 4 var headers = { 5 'Content-Type':'application/json', 6 "Accept": "application/json" 7 } 8 9 //オプションを定義 10 var options = { 11 url: 'https://api.soracom.io/v1/auth', 12 method: 'post', 13 headers: headers, 14 body : { 15 "email":"メールアドレス", 16 "password":"パスワード" 17 }, 18 json: true 19 } 20 21 //認証キーと認証に必要なトークンを受け取る 22 request(options, function(error, response, body){ 23 if (!error && response.statusCode == 200) { 24 25 var apikey = response.body["apiKey"]; 26 var token = response.body["token"]; 27 28 console.log("apikey: "+apikey); 29 console.log("token: "+token); 30 console.log("apiは成功しました"); 31 } else { 32 console.log('error: '+ response.statusCode); 33 console.log(response.body); 34 console.log("apiは失敗に終わりました"); 35 } 36 }); 37 38//api通信を行う 39 //ヘッダーを定義 40 headers = { 41 'Content-Type':'text/plain', 42 "Accept": "application/json", 43 "X-Soracom-API-Key":apikey, 44 "X-Soracom-Token":token 45 } 46 47//event.imsi は、無視してください 48 //オプションを定義 49 options = { 50 url: 'https://api.soracom.io/v1/subscribers/'+event.imsi+'/deactivate', 51 method: 'post', 52 headers: headers 53 } 54 55 request(options, function(error, response, body){ 56 if (!error && response.statusCode == 200) { 57 console.log(response.body); 58 console.log("apiは成功しました"); 59 } else { 60 console.log('error: '+ response.statusCode); 61 console.log(response.body); 62 console.log("apiは失敗に終わりました"); 63 } 64 });

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

console.log("apiは成功しました");

の下に

//api通信を行う

の処理を書きます

投稿2016/12/14 02:32

katsuya141

総合スコア367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

blossan

2016/12/14 02:34

とても簡単な解決策を提示して頂きありがとうございます。さっそく実行してみます。
guest

0

ベストアンサー

もとの書き方だと、//api通信を行う以下の行は、APIキーのリクエストが終わる前に実行されてしまいます。

解決策はいくつかありまして、

  • 認証キーを得た上でのリクエストを、認証キーのリクエストが返ってきたコールバックの中で行う
  • EventEmitterを立てて、「認証キーをセットして行う処理」を定義した上で、それを認証キーの返ってきたコールバックから呼び出す

などなど、JavaScriptは非同期処理だらけになってしまうので、各種の技法が存在します。

投稿2016/12/14 02:28

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

blossan

2016/12/14 02:30

ありがとうございます。原因と解決策を教えて頂き助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問