2017-11-30 14 views
2

完了した要求に応じて応答が異なることを希望します。私はPOSTリクエストを送信し、XMLファイルを受信して​​います。結果は、成功またはエラーのいずれかです。私はxml2jsonを使用してxmlをjsonオブジェクトに変換し、応答に応じてjsonを出力します。要求が処理された後にノードが応答します

問題は、応答内に応答を持つことができないことです。私はまた、後で使用するためにコールバックの値を保存することはできません(その非同期以降)。

私は約束を使用することを考えましたが、わかりません。私は何をすべきか?

動作の順序は

1)バッファ応答

3)バッファに参加を取得)要求

2に送信しなければなりません。 xmlをJSONに処理する

4)xmlがエラーで応答する場合、JSONエントリのタイプに応じて、res.json('success')またはres.json('error')のいずれかを出力します。

答えて

1

: 私はそれがこのようなものになるだろうと思います。問題は、2つの変数(両方ともresという名前)があるため、一方が他方をシャドーすることです。 res変数名の1つを変更するだけで、それをシャドーイングすることができます。たとえば、あなたが変更することができます。

const request = https.request(options, (http_res) // <--change argument name 

を次にそれ以降:

if (result.entry) { 
    console.log('✅ Success') 
    http_res.json('success') // <-- use the response object from request 

後で別の問題であるため、結果を保存することができますが、簡単に解決できない問題を。ソリューションは本当にあなたがしようとしているものに依存します。例えば、あなたはさらにデータを処理したい場合は、に応答データを呼び出して渡す機能を設定することができますような何か:あなたがデータを取得するとき、あなたは、単にそれを呼び出すことができます次に

function process_data(response){ 
    // use the response here 
} 

を:

if (result.entry) { 
    console.log('✅ Success') 
    http_res.json('success') // <-- use the response object from request 
    process_data(result) 

もちろん、ユースケースはもっと複雑ですが、具体的な回答が得られない場合もあります。

+0

ありがとうございます、それは魅力的でした。 – agomez

1

異なる変数であるため、両方のresに同じ名前を使用しないでください。また、単にres変数を使用して、要求に必要な値で応答します。あなたは、コールバックの内側に対応することができ

app.post('/ 

    api/submit', (req, res) => { 

     ... 

     const request = https.request(options, (resValue) => { 
     let chunks = []; 

     resValue.on("data", function(chunk) { 
      chunks.push(chunk); 
     }); 

     resValue.on("end", function(err) { 
      if (err) throw err; 
      let body = Buffer.concat(chunks); 

      xmlConverter(body, function(err, result) { 
      console.dir(result); 
      if (result.entry) { 
       console.log('✅ Success') 
       res.json('success') 
      } else if (result.error) { 
       console.log('There was an error processing your request'); 
       res.json('error') 
      } 
      }); 
     }); 
     }); 

     request.end() 
0

問題はなんですか? https.request(options、callbackFunction)に提供されるコールバック関数の引数の名前を完全に変更することができます。この変数の名前は重要ではありません。

app.post('/api/submit', (req, res) => { 

    const request = https.request(options, (potato) => { 
    let chunks = []; 

    potato.on("data", function(chunk) { 
     chunks.push(chunk); 
    }); 

    potato.on("end", function(err) { 
     if (err) throw err; // TODO res.status(500).json({}); ?? 
     let body = Buffer.concat(chunks); 

     xmlConverter(body, function(err, result) { 
     console.dir(result); 
     if (result.entry) { 
      console.log('✅ Success') 
      res.status(200).json({}); 
     } else if (result.error) { 
      console.log('There was an error processing your request'); 
      res.status(500).json({}); 
     } 

     request.end() 
     }); 
    }); 
    }); 
}); 
関連する問題